diff --git a/app/src/data/connection/Connection.ts b/app/src/data/connection/Connection.ts index e4ce455..f2ee073 100644 --- a/app/src/data/connection/Connection.ts +++ b/app/src/data/connection/Connection.ts @@ -73,6 +73,7 @@ export abstract class Connection { return false; } + // @todo: add if only first field is used in index supportsIndices(): boolean { return false; } diff --git a/app/src/data/entities/EntityManager.ts b/app/src/data/entities/EntityManager.ts index 6018029..9c08065 100644 --- a/app/src/data/entities/EntityManager.ts +++ b/app/src/data/entities/EntityManager.ts @@ -8,6 +8,7 @@ import { UnableToConnectException } from "../errors"; import { MutatorEvents, RepositoryEvents } from "../events"; +import type { Field } from "../fields/Field"; import type { EntityIndex } from "../fields/indices/EntityIndex"; import type { EntityRelation } from "../relations"; import { RelationAccessor } from "../relations/RelationAccessor"; @@ -142,6 +143,16 @@ export class EntityManager { return this.indices.some((e) => e.name === name); } + // @todo: add to Connection whether first index is used or not + getIndexedFields(_entity: Entity | string): Field[] { + const entity = this.entity(_entity); + const indices = this.getIndicesOf(entity); + const rel_fields = entity.fields.filter((f) => f.type === "relation"); + // assuming only first + const idx_fields = indices.map((index) => index.fields[0]); + return [entity.getPrimaryField(), ...rel_fields, ...idx_fields].filter(Boolean) as Field[]; + } + addRelation(relation: EntityRelation) { // check if entities are registered if (!this.entity(relation.source.entity.name) || !this.entity(relation.target.entity.name)) { diff --git a/app/src/data/entities/query/Repository.ts b/app/src/data/entities/query/Repository.ts index 8ddb10f..fc8f1ba 100644 --- a/app/src/data/entities/query/Repository.ts +++ b/app/src/data/entities/query/Repository.ts @@ -66,6 +66,13 @@ export class Repository f.name); + if (!indexed.includes(field)) { + $console.warn(`Field "${entity}.${field}" used in "${clause}" is not indexed`); + } + } + getValidOptions(options?: Partial): RepoQuery { const entity = this.entity; // @todo: if not cloned deep, it will keep references and error if multiple requests come in @@ -85,6 +92,7 @@ export class Repository { const media = this.getMediaEntity(true); this.ensureSchema( em({ [media.name as "media"]: media }, ({ index }, { media }) => { - index(media).on(["path"], true).on(["reference"]); + index(media).on(["path"], true).on(["reference"]).on(["entity_id"]); }) ); } catch (e) {