@contember/engine-content-api 2.1.0-alpha.29 → 2.1.0-alpha.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/mapper/select/ConditionBuilder.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'\nimport { UserError } from '../../exception'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] =>\n\t\t\t\tit[1] !== null,\n\t\t\t)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: ' +\n\t\t\t\t\tJSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\treturn handler[entries[0][0]](builder, entries[0][1])\n\t}\n}\n"],"names":["UserError","builder","builder2","Operator","Model","formatColumnIdentifier","Compiler"],"mappings":";;;;;AAIO,MAAM,iBAAiB;AAAA,EACtB,MACN,SACA,WACA,YACA,YACA,WACsB;AACtB,QAAI,cAAc,MAAM;AAChB,aAAA;AAAA,IAAA;AAER,UAAM,UAAU,OAAO,QAAQ,SAAS,EACtC;AAAA,MAAO,CAAkC,OACzC,GAAG,CAAC,MAAM;AAAA,IACX;AACG,QAAA,QAAQ,WAAW,GAAG;AAClB,aAAA;AAAA,IAAA;AAEJ,QAAA,QAAQ,SAAS,GAAG;AACvB,YAAM,IAAIA,UAAA;AAAA,QACT,uGACC,KAAK,UAAU,SAAS;AAAA,MAC1B;AAAA,IAAA;AAEK,UAAA,mBAAkD,CAAC,WAAW,UAAU;AAE9E,UAAM,UAKF;AAAA,MACH,KAAK,CAACC,UAAS,gBAAgBA,SAAQ,IAAI,CAAAC,cAAY,YAAY,OAAO,CAAC,UAAU,SAAS,KAAK,MAAM,UAAU,WAAW,YAAY,YAAY,IAAI,GAAGA,SAAQ,CAAC;AAAA,MACtK,IAAI,CAACD,UAAS,gBAAgBA,SAAQ,GAAG,CAAAC,cAAY,YAAY,OAAO,CAAC,UAAU,SAAS,KAAK,MAAM,UAAU,WAAW,YAAY,YAAY,IAAI,GAAGA,SAAQ,CAAC;AAAA,MACpK,KAAK,CAACD,UAAS,eAAeA,SAAQ,IAAI,CAAAC,cAAY,KAAK,MAAMA,WAAU,WAAW,YAAY,YAAY,UAAU,CAAC;AAAA,MAEzH,QAAQ,CAACD,UAAS,UAAU,QAAQA,SAAQ,OAAO,gBAAgB,IAAIA,SAAQ,IAAI,CAAA,WAAU,OAAO,OAAO,gBAAgB,CAAC;AAAA,MAE5H,IAAI,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,IAAI,KAAK;AAAA,MAC5E,OAAO,CAACF,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,OAAO,KAAK;AAAA,MAClF,IAAI,CAACF,UAAS,WAAWA,SAAQ,GAAG,kBAAkB,QAAQ,WAAW,UAAU;AAAA,MACnF,OAAO,CAACA,UAAS,WAAWA,SAAQ,IAAI,CAAAC,cAAYA,UAAS,GAAG,kBAAkB,MAAM,CAAC;AAAA,MACzF,IAAI,CAACD,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,IAAI,KAAK;AAAA,MAC5E,KAAK,CAACF,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,KAAK,KAAK;AAAA,MAC9E,IAAI,CAACF,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,IAAI,KAAK;AAAA,MAC5E,KAAK,CAACF,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,KAAK,KAAK;AAAA,MAE9E,UAAU,CAACF,UAAS,
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'\nimport { UserError } from '../../exception'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] =>\n\t\t\t\tit[1] !== null,\n\t\t\t)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: ' +\n\t\t\t\t\tJSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\treturn handler[entries[0][0]](builder, entries[0][1])\n\t}\n}\n"],"names":["UserError","builder","builder2","Operator","Model","formatColumnIdentifier","Compiler"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'\nimport { UserError } from '../../exception'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] =>\n\t\t\t\tit[1] !== null,\n\t\t\t)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: ' +\n\t\t\t\t\tJSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\treturn handler[entries[0][0]](builder, entries[0][1])\n\t}\n}\n"],"names":["builder","builder2"],"mappings":";;;AAIO,MAAM,iBAAiB;AAAA,EACtB,MACN,SACA,WACA,YACA,YACA,WACsB;AACtB,QAAI,cAAc,MAAM;AAChB,aAAA;AAAA,IAAA;AAER,UAAM,UAAU,OAAO,QAAQ,SAAS,EACtC;AAAA,MAAO,CAAkC,OACzC,GAAG,CAAC,MAAM;AAAA,IACX;AACG,QAAA,QAAQ,WAAW,GAAG;AAClB,aAAA;AAAA,IAAA;AAEJ,QAAA,QAAQ,SAAS,GAAG;AACvB,YAAM,IAAI;AAAA,QACT,uGACC,KAAK,UAAU,SAAS;AAAA,MAC1B;AAAA,IAAA;AAEK,UAAA,mBAAkD,CAAC,WAAW,UAAU;AAE9E,UAAM,UAKF;AAAA,MACH,KAAK,CAACA,UAAS,gBAAgBA,SAAQ,IAAI,CAAAC,cAAY,YAAY,OAAO,CAAC,UAAU,SAAS,KAAK,MAAM,UAAU,WAAW,YAAY,YAAY,IAAI,GAAGA,SAAQ,CAAC;AAAA,MACtK,IAAI,CAACD,UAAS,gBAAgBA,SAAQ,GAAG,CAAAC,cAAY,YAAY,OAAO,CAAC,UAAU,SAAS,KAAK,MAAM,UAAU,WAAW,YAAY,YAAY,IAAI,GAAGA,SAAQ,CAAC;AAAA,MACpK,KAAK,CAACD,UAAS,eAAeA,SAAQ,IAAI,CAAAC,cAAY,KAAK,MAAMA,WAAU,WAAW,YAAY,YAAY,UAAU,CAAC;AAAA,MAEzH,QAAQ,CAACD,UAAS,UAAU,QAAQA,SAAQ,OAAO,gBAAgB,IAAIA,SAAQ,IAAI,CAAA,WAAU,OAAO,OAAO,gBAAgB,CAAC;AAAA,MAE5H,IAAI,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,IAAI,KAAK;AAAA,MAC5E,OAAO,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,OAAO,KAAK;AAAA,MAClF,IAAI,CAACA,UAAS,WAAWA,SAAQ,GAAG,kBAAkB,QAAQ,WAAW,UAAU;AAAA,MACnF,OAAO,CAACA,UAAS,WAAWA,SAAQ,IAAI,CAAAC,cAAYA,UAAS,GAAG,kBAAkB,MAAM,CAAC;AAAA,MACzF,IAAI,CAACD,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,IAAI,KAAK;AAAA,MAC5E,KAAK,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,KAAK,KAAK;AAAA,MAC9E,IAAI,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,IAAI,KAAK;AAAA,MAC5E,KAAK,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,KAAK,KAAK;AAAA,MAE9E,UAAU,CAACA,UAAS,
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'\nimport { UserError } from '../../exception'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] =>\n\t\t\t\tit[1] !== null,\n\t\t\t)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: ' +\n\t\t\t\t\tJSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\treturn handler[entries[0][0]](builder, entries[0][1])\n\t}\n}\n"],"names":["builder","builder2"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'\nimport { UserError } from '../../exception'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] =>\n\t\t\t\tit[1] !== null,\n\t\t\t)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: ' +\n\t\t\t\t\tJSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\treturn handler[entries[0][0]](builder, entries[0][1])\n\t}\n}\n"],"names":["UserError","builder","builder2","Operator","Model","formatColumnIdentifier","Compiler"],"mappings":";;;;;AAIO,MAAM,iBAAiB;AAAA,EACtB,MACN,SACA,WACA,YACA,YACA,WACsB;AACtB,QAAI,cAAc,MAAM;AAChB,aAAA;AAAA,IAAA;AAER,UAAM,UAAU,OAAO,QAAQ,SAAS,EACtC;AAAA,MAAO,CAAkC,OACzC,GAAG,CAAC,MAAM;AAAA,IACX;AACG,QAAA,QAAQ,WAAW,GAAG;AAClB,aAAA;AAAA,IAAA;AAEJ,QAAA,QAAQ,SAAS,GAAG;AACvB,YAAM,IAAIA,UAAA;AAAA,QACT,uGACC,KAAK,UAAU,SAAS;AAAA,MAC1B;AAAA,IAAA;AAEK,UAAA,mBAAkD,CAAC,WAAW,UAAU;AAE9E,UAAM,UAKF;AAAA,MACH,KAAK,CAACC,UAAS,gBAAgBA,SAAQ,IAAI,CAAAC,cAAY,YAAY,OAAO,CAAC,UAAU,SAAS,KAAK,MAAM,UAAU,WAAW,YAAY,YAAY,IAAI,GAAGA,SAAQ,CAAC;AAAA,MACtK,IAAI,CAACD,UAAS,gBAAgBA,SAAQ,GAAG,CAAAC,cAAY,YAAY,OAAO,CAAC,UAAU,SAAS,KAAK,MAAM,UAAU,WAAW,YAAY,YAAY,IAAI,GAAGA,SAAQ,CAAC;AAAA,MACpK,KAAK,CAACD,UAAS,eAAeA,SAAQ,IAAI,CAAAC,cAAY,KAAK,MAAMA,WAAU,WAAW,YAAY,YAAY,UAAU,CAAC;AAAA,MAEzH,QAAQ,CAACD,UAAS,UAAU,QAAQA,SAAQ,OAAO,gBAAgB,IAAIA,SAAQ,IAAI,CAAA,WAAU,OAAO,OAAO,gBAAgB,CAAC;AAAA,MAE5H,IAAI,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,IAAI,KAAK;AAAA,MAC5E,OAAO,CAACF,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,OAAO,KAAK;AAAA,MAClF,IAAI,CAACF,UAAS,WAAWA,SAAQ,GAAG,kBAAkB,QAAQ,WAAW,UAAU;AAAA,MACnF,OAAO,CAACA,UAAS,WAAWA,SAAQ,IAAI,CAAAC,cAAYA,UAAS,GAAG,kBAAkB,MAAM,CAAC;AAAA,MACzF,IAAI,CAACD,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,IAAI,KAAK;AAAA,MAC5E,KAAK,CAACF,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,KAAK,KAAK;AAAA,MAC9E,IAAI,CAACF,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,IAAI,KAAK;AAAA,MAC5E,KAAK,CAACF,UAAS,UAAUA,SAAQ,QAAQ,kBAAkBE,SAAAA,SAAS,KAAK,KAAK;AAAA,MAE9E,UAAU,CAACF,UAAS,
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'\nimport { UserError } from '../../exception'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] =>\n\t\t\t\tit[1] !== null,\n\t\t\t)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: ' +\n\t\t\t\t\tJSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\treturn handler[entries[0][0]](builder, entries[0][1])\n\t}\n}\n"],"names":["UserError","builder","builder2","Operator","Model","formatColumnIdentifier","Compiler"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'\nimport { UserError } from '../../exception'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] =>\n\t\t\t\tit[1] !== null,\n\t\t\t)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: ' +\n\t\t\t\t\tJSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\treturn handler[entries[0][0]](builder, entries[0][1])\n\t}\n}\n"],"names":["builder","builder2"],"mappings":";;;AAIO,MAAM,iBAAiB;AAAA,EACtB,MACN,SACA,WACA,YACA,YACA,WACsB;AACtB,QAAI,cAAc,MAAM;AAChB,aAAA;AAAA,IAAA;AAER,UAAM,UAAU,OAAO,QAAQ,SAAS,EACtC;AAAA,MAAO,CAAkC,OACzC,GAAG,CAAC,MAAM;AAAA,IACX;AACG,QAAA,QAAQ,WAAW,GAAG;AAClB,aAAA;AAAA,IAAA;AAEJ,QAAA,QAAQ,SAAS,GAAG;AACvB,YAAM,IAAI;AAAA,QACT,uGACC,KAAK,UAAU,SAAS;AAAA,MAC1B;AAAA,IAAA;AAEK,UAAA,mBAAkD,CAAC,WAAW,UAAU;AAE9E,UAAM,UAKF;AAAA,MACH,KAAK,CAACA,UAAS,gBAAgBA,SAAQ,IAAI,CAAAC,cAAY,YAAY,OAAO,CAAC,UAAU,SAAS,KAAK,MAAM,UAAU,WAAW,YAAY,YAAY,IAAI,GAAGA,SAAQ,CAAC;AAAA,MACtK,IAAI,CAACD,UAAS,gBAAgBA,SAAQ,GAAG,CAAAC,cAAY,YAAY,OAAO,CAAC,UAAU,SAAS,KAAK,MAAM,UAAU,WAAW,YAAY,YAAY,IAAI,GAAGA,SAAQ,CAAC;AAAA,MACpK,KAAK,CAACD,UAAS,eAAeA,SAAQ,IAAI,CAAAC,cAAY,KAAK,MAAMA,WAAU,WAAW,YAAY,YAAY,UAAU,CAAC;AAAA,MAEzH,QAAQ,CAACD,UAAS,UAAU,QAAQA,SAAQ,OAAO,gBAAgB,IAAIA,SAAQ,IAAI,CAAA,WAAU,OAAO,OAAO,gBAAgB,CAAC;AAAA,MAE5H,IAAI,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,IAAI,KAAK;AAAA,MAC5E,OAAO,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,OAAO,KAAK;AAAA,MAClF,IAAI,CAACA,UAAS,WAAWA,SAAQ,GAAG,kBAAkB,QAAQ,WAAW,UAAU;AAAA,MACnF,OAAO,CAACA,UAAS,WAAWA,SAAQ,IAAI,CAAAC,cAAYA,UAAS,GAAG,kBAAkB,MAAM,CAAC;AAAA,MACzF,IAAI,CAACD,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,IAAI,KAAK;AAAA,MAC5E,KAAK,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,KAAK,KAAK;AAAA,MAC9E,IAAI,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,IAAI,KAAK;AAAA,MAC5E,KAAK,CAACA,UAAS,UAAUA,SAAQ,QAAQ,kBAAkB,SAAS,KAAK,KAAK;AAAA,MAE9E,UAAU,CAACA,UAAS,
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/ConditionBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'\nimport { UserError } from '../../exception'\n\nexport class ConditionBuilder {\n\tpublic build(\n\t\tbuilder: SqlConditionBuilder,\n\t\ttableName: string,\n\t\tcolumnName: string,\n\t\tcolumnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,\n\t\tcondition: Input.Condition<any> | null,\n\t): SqlConditionBuilder {\n\t\tif (condition === null) {\n\t\t\treturn builder\n\t\t}\n\t\tconst entries = Object.entries(condition)\n\t\t\t.filter(<T extends keyof Input.Condition>(it: [string, any]): it is [T, Input.Condition[T]] =>\n\t\t\t\tit[1] !== null,\n\t\t\t)\n\t\tif (entries.length === 0) {\n\t\t\treturn builder\n\t\t}\n\t\tif (entries.length > 1) {\n\t\t\tthrow new UserError(\n\t\t\t\t'Only single field is allowed. If you want to combine multiple conditions, use \"and\" or \"or\". Got: ' +\n\t\t\t\t\tJSON.stringify(condition),\n\t\t\t)\n\t\t}\n\t\tconst columnIdentifier: QueryBuilder.ColumnIdentifier = [tableName, columnName]\n\n\t\tconst handler: {\n\t\t\t[K in keyof Required<Input.Condition<any>>]: (\n\t\t\t\tbuilder: SqlConditionBuilder,\n\t\t\t\tparam: Exclude<Input.Condition<any>[K], undefined>,\n\t\t\t) => SqlConditionBuilder\n\t\t} = {\n\t\t\tand: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tor: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),\n\t\t\tnot: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),\n\n\t\t\tisNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\n\t\t\teq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),\n\t\t\tnotEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),\n\t\t\tin: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),\n\t\t\tnotIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),\n\t\t\tlt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),\n\t\t\tlte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),\n\t\t\tgt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),\n\t\t\tgte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),\n\n\t\t\tincludes: (builder, value: any) => {\n\t\t\t\tif (columnType.type === Model.ColumnType.Json) {\n\t\t\t\t\t// For JSON columns, use @> operator to check if JSON contains the value\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))\n\t\t\t\t} else {\n\t\t\t\t\t// For array columns, use @> operator with array casting\n\t\t\t\t\tconst cast = columnType.type === Model.ColumnType.Enum\n\t\t\t\t\t\t? `${Compiler.SCHEMA_PLACEHOLDER}.\"${columnType.columnType}\"`\n\t\t\t\t\t\t: columnType.columnType\n\n\t\t\t\t\treturn builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),\n\t\t\tminLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),\n\n\t\t\tcontains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),\n\t\t\tstartsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),\n\t\t\tendsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),\n\t\t\tcontainsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),\n\t\t\tstartsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),\n\t\t\tendsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),\n\n\t\t\tnever: builder => builder.raw('false'),\n\t\t\talways: builder => builder.raw('true'),\n\n\t\t\t// deprecated\n\t\t\tnull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),\n\t\t}\n\n\t\treturn handler[entries[0][0]](builder, entries[0][1])\n\t}\n}\n"],"names":["builder","builder2"],"mappings":"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"}
|