分岐の構造はすでに明確にあります!
でも、 Filter の状態によって分岐を書くのはまだ初期化されていませんね。パターンは「条件分岐 + Default Case」なので、実装例を作りましょう。
```typescript
async query(filter: Filter): Promise
if (
Object.keys(filter).every((key) => ["ids", "limit"].includes(key)) &&
Array.isArray(filter.ids) &&
filter.ids.length <= nip11.limitation.max_limit
) {
//_idsが存在する場合はKVからデータを取得
return fromKV(filter.ids);
} else if (filter.ids && filter.ids.length > 0) { // idsが存在して yet?
//idsが存在するとDBからデータを取得、そしてKVにした
const ids = fromDB(filter);
return fromKV(ids);
} else {
// conditionsが満たされない場合は Default Case から取る
// Default Case では何も取得しない?
// まずはDBからデータを取得する
const ids = fromDB(filter);
return fromKV(ids);
}
}
```
この実装例では、`ids` が存在し、その長さが `nip11.limitation.max_limit` 未満の場合に KV からデータを取得します。その他の場合は、DB からデータを取得して KV にします。Default Case では、DB からデータを取得します。
しかし、この条件分岐構造はやや複雑です。分岐のパターンとしても使えませんね。そこで「多方位的条件分岐」というパターンを考えてみましょう。
```typescript
async query(filter: Filter): Promise
const isIdsPresent = Object.keys(filter).every((key) => ["ids", "limit"].includes(key)) &&
Array.isArray(filter.ids) &&
filter.ids.length <= nip11.limitation.max_limit
if (isIdsPresent) {
return fromKV(filter.ids);
} else {
// Default Case
const ids = fromDB(filter);
return fromKV(ids);
}
}
```
この「多方位的条件分岐」パターンでは、まずは `isIdsPresent` の値を取得します。その後にそれに基づいて条件分岐を実行します。条件分岐に必要なデータはすでに入っているので、再度から DB にアクセスする必要はありません。