objection 3.9.1 → 4.0.0-rc.1
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/lib/dbErrors/LICENSE +21 -0
- package/lib/dbErrors/errorCodes/mssql.js +19 -0
- package/lib/dbErrors/errorCodes/mysql.js +805 -0
- package/lib/dbErrors/errorCodes/postgres.js +241 -0
- package/lib/dbErrors/errors/CheckViolationError.js +10 -0
- package/lib/dbErrors/errors/ConstraintViolationError.js +3 -0
- package/lib/dbErrors/errors/DBError.js +9 -0
- package/lib/dbErrors/errors/DataError.js +3 -0
- package/lib/dbErrors/errors/ForeignKeyViolationError.js +11 -0
- package/lib/dbErrors/errors/NotNullViolationError.js +12 -0
- package/lib/dbErrors/errors/UniqueViolationError.js +12 -0
- package/lib/dbErrors/index.js +59 -0
- package/lib/dbErrors/parsers/mssql/DBError/CheckViolationError/parser.js +28 -0
- package/lib/dbErrors/parsers/mssql/DBError/DataError/parser.js +25 -0
- package/lib/dbErrors/parsers/mssql/DBError/ForeignKeyViolationError/parser.js +39 -0
- package/lib/dbErrors/parsers/mssql/DBError/NotNullViolationError/parser.js +30 -0
- package/lib/dbErrors/parsers/mssql/DBError/UniqueViolationError/parser.js +53 -0
- package/lib/dbErrors/parsers/mssql/DBError/parser.js +51 -0
- package/lib/dbErrors/parsers/mssql/DBError/util.js +16 -0
- package/lib/dbErrors/parsers/mysql/DBError/ConstraintViolationError/ForeignKeyViolationError/parser.js +43 -0
- package/lib/dbErrors/parsers/mysql/DBError/ConstraintViolationError/NotNullViolationError/parser.js +29 -0
- package/lib/dbErrors/parsers/mysql/DBError/ConstraintViolationError/UniqueViolationError/parser.js +27 -0
- package/lib/dbErrors/parsers/mysql/DBError/ConstraintViolationError/parser.js +23 -0
- package/lib/dbErrors/parsers/mysql/DBError/DataError/parser.js +24 -0
- package/lib/dbErrors/parsers/mysql/DBError/parser.js +28 -0
- package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/CheckViolationError/parser.js +18 -0
- package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/ForeignKeyViolationError/parser.js +18 -0
- package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/NotNullViolationError/parser.js +18 -0
- package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/UniqueViolationError/parser.js +40 -0
- package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/parser.js +25 -0
- package/lib/dbErrors/parsers/postgres/DBError/DataError/parser.js +16 -0
- package/lib/dbErrors/parsers/postgres/DBError/parser.js +27 -0
- package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/CheckViolationError/parser.js +20 -0
- package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/ForeignKeyViolationError/parser.js +20 -0
- package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/NotNullViolationError/parser.js +27 -0
- package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/UniqueViolationError/parser.js +28 -0
- package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/parser.js +24 -0
- package/lib/dbErrors/parsers/sqlite/DBError/parser.js +23 -0
- package/lib/dbErrors/utils/sqlState.js +3 -0
- package/lib/initialize.js +1 -7
- package/lib/model/AjvValidator.js +51 -117
- package/lib/model/Model.js +84 -59
- package/lib/model/ModifierNotFoundError.js +1 -7
- package/lib/model/NotFoundError.js +1 -7
- package/lib/model/RelationDoesNotExistError.js +1 -7
- package/lib/model/ValidationError.js +3 -10
- package/lib/model/Validator.js +1 -7
- package/lib/model/getModel.js +7 -6
- package/lib/model/inheritModel.js +1 -7
- package/lib/model/modelBindKnex.js +4 -10
- package/lib/model/modelClone.js +5 -11
- package/lib/model/modelColPropMap.js +3 -10
- package/lib/model/modelId.js +3 -10
- package/lib/model/modelJsonAttributes.js +35 -16
- package/lib/model/modelParseRelations.js +2 -8
- package/lib/model/modelQueryProps.js +11 -23
- package/lib/model/modelSet.js +89 -41
- package/lib/model/modelTableMetadata.js +4 -11
- package/lib/model/modelToJson.js +6 -13
- package/lib/model/modelUtils.js +14 -13
- package/lib/model/modelValidate.js +3 -9
- package/lib/model/modelValues.js +5 -14
- package/lib/model/modelVisitor.js +1 -7
- package/lib/objection.js +33 -71
- package/lib/queryBuilder/FunctionBuilder.js +4 -11
- package/lib/queryBuilder/InternalOptions.js +4 -9
- package/lib/queryBuilder/JoinBuilder.js +5 -8
- package/lib/queryBuilder/QueryBuilder.js +126 -95
- package/lib/queryBuilder/QueryBuilderBase.js +41 -123
- package/lib/queryBuilder/QueryBuilderContext.js +2 -8
- package/lib/queryBuilder/QueryBuilderContextBase.js +2 -8
- package/lib/queryBuilder/QueryBuilderOperationSupport.js +7 -21
- package/lib/queryBuilder/QueryBuilderUserContext.js +1 -7
- package/lib/queryBuilder/RawBuilder.js +5 -13
- package/lib/queryBuilder/ReferenceBuilder.js +20 -48
- package/lib/queryBuilder/RelationExpression.js +18 -16
- package/lib/queryBuilder/StaticHookArguments.js +74 -16
- package/lib/queryBuilder/ValueBuilder.js +11 -13
- package/lib/queryBuilder/getJoinBuilder.js +10 -0
- package/lib/queryBuilder/graph/GraphLoader.js +304 -0
- package/lib/queryBuilder/graph/GraphNode.js +235 -0
- package/lib/queryBuilder/graph/GraphOptions.js +55 -248
- package/lib/queryBuilder/graph/GraphPlan.js +395 -0
- package/lib/queryBuilder/graph/GraphUpsert.js +466 -414
- package/lib/queryBuilder/graph/GraphWriter.js +1263 -0
- package/lib/queryBuilder/join/JoinResultColumn.js +1 -7
- package/lib/queryBuilder/join/JoinResultParser.js +6 -11
- package/lib/queryBuilder/join/RelationJoiner.js +66 -84
- package/lib/queryBuilder/join/TableNode.js +2 -8
- package/lib/queryBuilder/join/TableTree.js +3 -9
- package/lib/queryBuilder/join/utils.js +5 -15
- package/lib/queryBuilder/jsonDialects/JsonDialect.js +51 -0
- package/lib/queryBuilder/jsonDialects/MySqlJsonDialect.js +81 -0
- package/lib/queryBuilder/jsonDialects/PostgresJsonDialect.js +45 -0
- package/lib/queryBuilder/jsonDialects/SqliteJsonDialect.js +67 -0
- package/lib/queryBuilder/jsonDialects/index.js +44 -0
- package/lib/queryBuilder/operations/DelegateOperation.js +2 -8
- package/lib/queryBuilder/operations/DeleteOperation.js +10 -39
- package/lib/queryBuilder/operations/FindByIdOperation.js +7 -12
- package/lib/queryBuilder/operations/FindByIdsOperation.js +4 -8
- package/lib/queryBuilder/operations/FindOperation.js +14 -34
- package/lib/queryBuilder/operations/FirstOperation.js +6 -10
- package/lib/queryBuilder/operations/FromOperation.js +3 -9
- package/lib/queryBuilder/operations/InsertAndFetchOperation.js +13 -12
- package/lib/queryBuilder/operations/InsertGraphAndFetchOperation.js +4 -10
- package/lib/queryBuilder/operations/InsertGraphOperation.js +7 -18
- package/lib/queryBuilder/operations/InsertOperation.js +118 -45
- package/lib/queryBuilder/operations/InstanceDeleteOperation.js +5 -12
- package/lib/queryBuilder/operations/InstanceFindOperation.js +4 -11
- package/lib/queryBuilder/operations/InstanceInsertOperation.js +2 -8
- package/lib/queryBuilder/operations/InstanceUpdateOperation.js +7 -14
- package/lib/queryBuilder/operations/JoinRelatedOperation.js +5 -11
- package/lib/queryBuilder/operations/KnexOperation.js +2 -8
- package/lib/queryBuilder/operations/LimitPerParentOperation.js +7 -69
- package/lib/queryBuilder/operations/MergeOperation.js +5 -11
- package/lib/queryBuilder/operations/NoneOperation.js +2 -8
- package/lib/queryBuilder/operations/ObjectionToKnexConvertingOperation.js +20 -49
- package/lib/queryBuilder/operations/OnBuildKnexOperation.js +2 -8
- package/lib/queryBuilder/operations/OnBuildOperation.js +2 -8
- package/lib/queryBuilder/operations/OnErrorOperation.js +2 -8
- package/lib/queryBuilder/operations/QueryBuilderOperation.js +1 -7
- package/lib/queryBuilder/operations/RangeOperation.js +11 -26
- package/lib/queryBuilder/operations/RelateOperation.js +2 -8
- package/lib/queryBuilder/operations/ReturningOperation.js +3 -9
- package/lib/queryBuilder/operations/RunAfterOperation.js +2 -12
- package/lib/queryBuilder/operations/RunBeforeOperation.js +2 -8
- package/lib/queryBuilder/operations/UnrelateOperation.js +2 -8
- package/lib/queryBuilder/operations/UpdateAndFetchOperation.js +14 -17
- package/lib/queryBuilder/operations/UpdateOperation.js +32 -132
- package/lib/queryBuilder/operations/UpsertGraphAndFetchOperation.js +8 -11
- package/lib/queryBuilder/operations/UpsertGraphOperation.js +6 -12
- package/lib/queryBuilder/operations/WhereCompositeOperation.js +3 -9
- package/lib/queryBuilder/operations/WhereGroupOperation.js +2 -8
- package/lib/queryBuilder/operations/eager/EagerOperation.js +3 -9
- package/lib/queryBuilder/operations/eager/JoinEagerOperation.js +72 -10
- package/lib/queryBuilder/operations/eager/NaiveEagerOperation.js +2 -8
- package/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +23 -44
- package/lib/queryBuilder/operations/fieldExpressions.js +122 -0
- package/lib/queryBuilder/operations/jsonApi/WhereJsonHasOperation.js +20 -0
- package/lib/queryBuilder/operations/jsonApi/WhereJsonOperation.js +44 -0
- package/lib/queryBuilder/operations/jsonApi/WhereJsonTypeOperation.js +14 -0
- package/lib/queryBuilder/operations/select/SelectOperation.js +11 -21
- package/lib/queryBuilder/operations/select/Selection.js +19 -17
- package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeMsSqlOperation.js +4 -10
- package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeOperation.js +4 -10
- package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeSqliteOperation.js +4 -10
- package/lib/queryBuilder/operations/windowOrder.js +56 -0
- package/lib/queryBuilder/parsers/jsonFieldExpressionParser.js +3 -7
- package/lib/queryBuilder/parsers/relationExpressionParser.js +42 -43
- package/lib/queryBuilder/parsers/relationExpressionParser.pegjs +39 -36
- package/lib/queryBuilder/transformations/CompositeQueryTransformation.js +2 -8
- package/lib/queryBuilder/transformations/QueryTransformation.js +1 -7
- package/lib/queryBuilder/transformations/WrapMysqlModifySubqueryTransformation.js +3 -9
- package/lib/queryBuilder/transformations/index.js +3 -11
- package/lib/queryBuilder/whereGroups.js +9 -24
- package/lib/queryBuilder/withoutOrder.js +4 -11
- package/lib/relations/Relation.js +47 -28
- package/lib/relations/RelationDeleteOperation.js +4 -14
- package/lib/relations/RelationFindOperation.js +119 -90
- package/lib/relations/RelationInsertOperation.js +2 -8
- package/lib/relations/RelationOwner.js +5 -11
- package/lib/relations/RelationProperty.js +4 -10
- package/lib/relations/RelationUpdateOperation.js +4 -14
- package/lib/relations/RelationWriteResultOperation.js +15 -0
- package/lib/relations/belongsToMany/BelongsToManyDeleteOperation.js +23 -0
- package/lib/relations/belongsToMany/BelongsToManyFindOperation.js +35 -0
- package/lib/relations/belongsToMany/BelongsToManyInsertOperation.js +28 -0
- package/lib/relations/belongsToMany/BelongsToManyRelateOperation.js +16 -0
- package/lib/relations/belongsToMany/BelongsToManyRelation.js +276 -0
- package/lib/relations/belongsToMany/BelongsToManyUnrelateOperation.js +11 -0
- package/lib/relations/belongsToOne/BelongsToOneDeleteOperation.js +2 -8
- package/lib/relations/belongsToOne/BelongsToOneInsertOperation.js +6 -11
- package/lib/relations/belongsToOne/BelongsToOneRelateOperation.js +3 -9
- package/lib/relations/belongsToOne/BelongsToOneRelation.js +8 -19
- package/lib/relations/belongsToOne/BelongsToOneUnrelateOperation.js +53 -27
- package/lib/relations/hasMany/HasManyInsertOperation.js +5 -10
- package/lib/relations/hasMany/HasManyRelateOperation.js +5 -11
- package/lib/relations/hasMany/HasManyRelation.js +9 -11
- package/lib/relations/hasMany/HasManyUnrelateOperation.js +3 -9
- package/lib/relations/hasOne/HasOneRelation.js +2 -8
- package/lib/relations/hasOneThrough/HasOneThroughRelation.js +2 -8
- package/lib/relations/manyToMany/ManyToManyModifyMixin.js +10 -15
- package/lib/relations/manyToMany/ManyToManyMySqlModifyMixin.js +2 -8
- package/lib/relations/manyToMany/ManyToManyRelation.js +82 -50
- package/lib/relations/manyToMany/ManyToManySqliteModifyMixin.js +2 -8
- package/lib/relations/manyToMany/delete/ManyToManyDeleteOperation.js +5 -9
- package/lib/relations/manyToMany/delete/ManyToManyDeleteOperationBase.js +2 -8
- package/lib/relations/manyToMany/delete/ManyToManyDeleteSqliteOperation.js +3 -9
- package/lib/relations/manyToMany/find/ManyToManyFindOperation.js +20 -59
- package/lib/relations/manyToMany/insert/ManyToManyInsertOperation.js +6 -11
- package/lib/relations/manyToMany/relate/ManyToManyRelateOperation.js +4 -10
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateMySqlOperation.js +3 -9
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperation.js +5 -9
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperationBase.js +3 -9
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateSqliteOperation.js +3 -9
- package/lib/relations/manyToMany/update/ManyToManyUpdateMySqlOperation.js +3 -9
- package/lib/relations/manyToMany/update/ManyToManyUpdateOperation.js +5 -9
- package/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js +64 -72
- package/lib/relations/manyToMany/update/ManyToManyUpdateSqliteOperation.js +3 -9
- package/lib/transaction.js +3 -9
- package/lib/utils/assert.js +3 -11
- package/lib/utils/buildUtils.js +2 -8
- package/lib/utils/classUtils.js +1 -7
- package/lib/utils/createModifier.js +2 -8
- package/lib/utils/identifierMapping.js +23 -27
- package/lib/utils/internalPropUtils.js +1 -7
- package/lib/utils/knexUtils.js +84 -40
- package/lib/utils/mixin.js +3 -10
- package/lib/utils/normalizeIds.js +2 -8
- package/lib/utils/objectUtils.js +41 -60
- package/lib/utils/parseFieldExpression.js +16 -16
- package/lib/utils/promiseUtils/after.js +2 -8
- package/lib/utils/promiseUtils/afterReturn.js +2 -8
- package/lib/utils/promiseUtils/index.js +7 -16
- package/lib/utils/promiseUtils/isPromise.js +2 -8
- package/lib/utils/promiseUtils/map.js +2 -8
- package/lib/utils/promiseUtils/mapAfterAllReturn.js +2 -8
- package/lib/utils/promiseUtils/try.js +2 -8
- package/lib/utils/resolveModel.js +10 -17
- package/lib/utils/tmpColumnUtils.js +2 -9
- package/lib/utils/warnings.js +2 -14
- package/package.json +25 -17
- package/typings/objection/index.d.ts +3217 -2179
- package/lib/.eslintrc.json +0 -8
- package/lib/model/graph/ModelGraph.js +0 -80
- package/lib/model/graph/ModelGraphBuilder.js +0 -241
- package/lib/model/graph/ModelGraphEdge.js +0 -52
- package/lib/model/graph/ModelGraphNode.js +0 -238
- package/lib/queryBuilder/graph/GraphAction.js +0 -69
- package/lib/queryBuilder/graph/GraphData.js +0 -53
- package/lib/queryBuilder/graph/GraphFetcher.js +0 -197
- package/lib/queryBuilder/graph/GraphNodeDbExistence.js +0 -184
- package/lib/queryBuilder/graph/GraphOperation.js +0 -27
- package/lib/queryBuilder/graph/delete/GraphDelete.js +0 -73
- package/lib/queryBuilder/graph/delete/GraphDeleteAction.js +0 -88
- package/lib/queryBuilder/graph/insert/DeferredRelationGraphInsertAction.js +0 -58
- package/lib/queryBuilder/graph/insert/GraphInsert.js +0 -296
- package/lib/queryBuilder/graph/insert/GraphInsertAction.js +0 -233
- package/lib/queryBuilder/graph/insert/JoinRowGraphInsertAction.js +0 -92
- package/lib/queryBuilder/graph/patch/GraphPatch.js +0 -20
- package/lib/queryBuilder/graph/patch/GraphPatchAction.js +0 -289
- package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsert.js +0 -31
- package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsertAction.js +0 -126
- package/lib/queryBuilder/operations/jsonApi/WhereJsonHasPostgresOperation.js +0 -30
- package/lib/queryBuilder/operations/jsonApi/WhereJsonNotObjectPostgresOperation.js +0 -37
- package/lib/queryBuilder/operations/jsonApi/WhereJsonPostgresOperation.js +0 -62
- package/lib/queryBuilder/operations/jsonApi/postgresJsonApi.js +0 -192
- package/lib/utils/wrapDbError.js +0 -64
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const parser = require('../../../utils/parseFieldExpression');
|
|
4
|
-
const { asArray, isObject, isString } = require('../../../utils/objectUtils');
|
|
5
|
-
const { isKnexRaw, isKnexQueryBuilder, isPostgres } = require('../../../utils/knexUtils');
|
|
6
|
-
const { warnOnce } = require('../../../utils/warnings');
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @typedef {String} FieldExpression
|
|
10
|
-
*
|
|
11
|
-
* Field expressions allow one to refer to separate JSONB fields inside columns.
|
|
12
|
-
*
|
|
13
|
-
* Syntax: <column reference>[:<json field reference>]
|
|
14
|
-
*
|
|
15
|
-
* e.g. `Person.jsonColumnName:details.names[1]` would refer to value `'Second'`
|
|
16
|
-
* in column `Person.jsonColumnName` which has
|
|
17
|
-
* `{ details: { names: ['First', 'Second', 'Last'] } }` object stored in it.
|
|
18
|
-
*
|
|
19
|
-
* First part `<column reference>` is compatible with column references used in
|
|
20
|
-
* knex e.g. `MyFancyTable.tributeToThBestColumnNameEver`.
|
|
21
|
-
*
|
|
22
|
-
* Second part describes a path to an attribute inside the referred column.
|
|
23
|
-
* It is optional and it always starts with colon which follows directly with
|
|
24
|
-
* first path element. e.g. `Table.jsonObjectColumnName:jsonFieldName` or
|
|
25
|
-
* `Table.jsonArrayColumn:[321]`.
|
|
26
|
-
*
|
|
27
|
-
* Syntax supports `[<key or index>]` and `.<key or index>` flavors of reference
|
|
28
|
-
* to json keys / array indexes:
|
|
29
|
-
*
|
|
30
|
-
* e.g. both `Table.myColumn:[1][3]` and `Table.myColumn:1.3` would access correctly
|
|
31
|
-
* both of the following objects `[null, [null,null,null, "I was accessed"]]` and
|
|
32
|
-
* `{ "1": { "3" : "I was accessed" } }`
|
|
33
|
-
*
|
|
34
|
-
* Caveats when using special characters in keys:
|
|
35
|
-
*
|
|
36
|
-
* 1. `objectColumn.key` This is the most common syntax, good if you are
|
|
37
|
-
* not using dots or square brackets `[]` in your json object key name.
|
|
38
|
-
* 2. Keys containing dots `objectColumn:[keywith.dots]` Column `{ "keywith.dots" : "I was referred" }`
|
|
39
|
-
* 3. Keys containing square brackets `column['[]']` `{ "[]" : "This is getting ridiculous..." }`
|
|
40
|
-
* 4. Keys containing square brackets and quotes
|
|
41
|
-
* `objectColumn:['Double."Quote".[]']` and `objectColumn:["Sinlge.'Quote'.[]"]`
|
|
42
|
-
* Column `{ "Double.\"Quote\".[]" : "I was referred", "Single.'Quote'.[]" : "Mee too!" }`
|
|
43
|
-
* 5. Empty keys `objectColumn:[""]` or `objectColumn:['']` Column `{ "" : "I was referred" }`
|
|
44
|
-
* 99. Keys containing dots, square brackets, single quotes and double quotes in one json key is
|
|
45
|
-
* not currently supported
|
|
46
|
-
*/
|
|
47
|
-
|
|
48
|
-
// JSON field expressions and the `whereJson*()` methods generate Postgres-only
|
|
49
|
-
// SQL (ditojs#113). As some of it happens to run on other databases, only warn.
|
|
50
|
-
// TODO: Consider throwing an error instead in objection 4.0 (#272).
|
|
51
|
-
function warnIfNotPostgres(knex) {
|
|
52
|
-
if (!isPostgres(knex)) {
|
|
53
|
-
warnOnce(
|
|
54
|
-
'JSON field expressions and the whereJson*() methods of objection are only supported ' +
|
|
55
|
-
'on PostgreSQL. Use the JSON methods of knex like whereJsonPath() or jsonExtract() ' +
|
|
56
|
-
'with other databases.',
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Returns the SQL and bindings of a field expression. The column is passed as an
|
|
62
|
-
// identifier binding (`??`), so that knex's `wrapIdentifier` (e.g. used by
|
|
63
|
-
// `knexSnakeCaseMappers()`) is applied to it.
|
|
64
|
-
function parseFieldExpression(expression, extractAsText) {
|
|
65
|
-
let parsed = parser.parseFieldExpression(expression);
|
|
66
|
-
let bindings = [parsed.columnName];
|
|
67
|
-
// Reference the bare column when there is no json path, so that Postgres can
|
|
68
|
-
// use indexes on it. `#>> '{}'` is still needed to extract the value as text.
|
|
69
|
-
if (parsed.access.length === 0 && !extractAsText) {
|
|
70
|
-
return ['??', bindings];
|
|
71
|
-
}
|
|
72
|
-
let extractor = extractAsText ? '#>>' : '#>';
|
|
73
|
-
return [`??${extractor}${parser.toPostgresJsonPathLiteral(parsed.access)}`, bindings];
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function whereJsonbRefOnLeftJsonbValOrRefOnRight(
|
|
77
|
-
builder,
|
|
78
|
-
fieldExpression,
|
|
79
|
-
operator,
|
|
80
|
-
jsonObjectOrFieldExpression,
|
|
81
|
-
queryPrefix,
|
|
82
|
-
) {
|
|
83
|
-
let queryParams = whereJsonbRefOnLeftJsonbValOrRefOnRightRawQueryParams(
|
|
84
|
-
fieldExpression,
|
|
85
|
-
operator,
|
|
86
|
-
jsonObjectOrFieldExpression,
|
|
87
|
-
queryPrefix,
|
|
88
|
-
);
|
|
89
|
-
return builder.whereRaw.apply(builder, queryParams);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function whereJsonbRefOnLeftJsonbValOrRefOnRightRawQueryParams(
|
|
93
|
-
fieldExpression,
|
|
94
|
-
operator,
|
|
95
|
-
jsonObjectOrFieldExpression,
|
|
96
|
-
queryPrefix,
|
|
97
|
-
) {
|
|
98
|
-
let [fieldReference, bindings] = parseFieldExpression(fieldExpression);
|
|
99
|
-
let [rightHandSql, rightHandBindings] = rightHandExpression(jsonObjectOrFieldExpression);
|
|
100
|
-
let query = ['(', fieldReference, ')::jsonb', operator, rightHandSql];
|
|
101
|
-
|
|
102
|
-
if (queryPrefix) {
|
|
103
|
-
query.unshift(queryPrefix);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return [query.join(' '), [...bindings, ...rightHandBindings]];
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function rightHandExpression(jsonObjectOrFieldExpression) {
|
|
110
|
-
if (isString(jsonObjectOrFieldExpression)) {
|
|
111
|
-
let [rightHandReference, bindings] = parseFieldExpression(jsonObjectOrFieldExpression);
|
|
112
|
-
return [`( ${rightHandReference} )::jsonb`, bindings];
|
|
113
|
-
} else if (
|
|
114
|
-
isKnexRaw(jsonObjectOrFieldExpression) ||
|
|
115
|
-
isKnexQueryBuilder(jsonObjectOrFieldExpression)
|
|
116
|
-
) {
|
|
117
|
-
// ref(), val(), raw() and subqueries, already converted to knex by the operation.
|
|
118
|
-
return ['( ? )::jsonb', [jsonObjectOrFieldExpression]];
|
|
119
|
-
} else if (isObject(jsonObjectOrFieldExpression)) {
|
|
120
|
-
return ['?::jsonb', [JSON.stringify(jsonObjectOrFieldExpression)]];
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
throw new Error('Invalid right hand expression.');
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function whereJsonFieldRightStringArrayOnLeftQuery(knex, fieldExpression, operator, keys) {
|
|
127
|
-
let [fieldReference, bindings] = parseFieldExpression(fieldExpression);
|
|
128
|
-
keys = asArray(keys);
|
|
129
|
-
|
|
130
|
-
let questionMarksArray = keys.map((key) => {
|
|
131
|
-
if (!isString(key)) {
|
|
132
|
-
throw new Error('All keys to find must be strings.');
|
|
133
|
-
}
|
|
134
|
-
return '?';
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
return [
|
|
138
|
-
`${fieldReference} ${operator.replace('?', '\\?')} array[${questionMarksArray.join(',')}]`,
|
|
139
|
-
[...bindings, ...keys],
|
|
140
|
-
];
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
function whereJsonFieldQuery(knex, fieldExpression, operator, value) {
|
|
144
|
-
let [fieldReference, bindings] = parseFieldExpression(fieldExpression, true);
|
|
145
|
-
let normalizedOperator = normalizeOperator(knex, operator);
|
|
146
|
-
|
|
147
|
-
// json type comparison takes json type in string format
|
|
148
|
-
let cast;
|
|
149
|
-
let valuePlaceholder = '?';
|
|
150
|
-
let type = typeof value;
|
|
151
|
-
|
|
152
|
-
if (type === 'number') {
|
|
153
|
-
cast = '::NUMERIC';
|
|
154
|
-
} else if (type === 'boolean') {
|
|
155
|
-
cast = '::BOOLEAN';
|
|
156
|
-
} else if (type === 'string') {
|
|
157
|
-
cast = '::TEXT';
|
|
158
|
-
} else if (value === null) {
|
|
159
|
-
cast = '::TEXT';
|
|
160
|
-
valuePlaceholder = 'NULL';
|
|
161
|
-
} else {
|
|
162
|
-
throw new Error('Value must be string, number, boolean or null.');
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// Bind the value so that `?` in it isn't read as a binding placeholder.
|
|
166
|
-
return [
|
|
167
|
-
`(${fieldReference})${cast} ${normalizedOperator} ${valuePlaceholder}`,
|
|
168
|
-
value === null ? bindings : [...bindings, value],
|
|
169
|
-
];
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function normalizeOperator(knex, operator) {
|
|
173
|
-
let trimmedLowerCase = operator.trim().toLowerCase();
|
|
174
|
-
|
|
175
|
-
switch (trimmedLowerCase) {
|
|
176
|
-
case 'is':
|
|
177
|
-
case 'is not':
|
|
178
|
-
return trimmedLowerCase;
|
|
179
|
-
default:
|
|
180
|
-
return knex.client.formatter().operator(operator);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
module.exports = {
|
|
185
|
-
warnIfNotPostgres,
|
|
186
|
-
parseFieldExpression: parseFieldExpression,
|
|
187
|
-
whereJsonbRefOnLeftJsonbValOrRefOnRight: whereJsonbRefOnLeftJsonbValOrRefOnRight,
|
|
188
|
-
whereJsonbRefOnLeftJsonbValOrRefOnRightRawQueryParams:
|
|
189
|
-
whereJsonbRefOnLeftJsonbValOrRefOnRightRawQueryParams,
|
|
190
|
-
whereJsonFieldRightStringArrayOnLeftQuery: whereJsonFieldRightStringArrayOnLeftQuery,
|
|
191
|
-
whereJsonFieldQuery: whereJsonFieldQuery,
|
|
192
|
-
};
|
package/lib/utils/wrapDbError.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { wrapError, DBError, UniqueViolationError } = require('db-errors');
|
|
4
|
-
|
|
5
|
-
// db-errors only recognizes mssql unique key violations, but primary key
|
|
6
|
-
// violations have the same error number, with a different message (#2688).
|
|
7
|
-
const MSSQL_PRIMARY_KEY_REGEX =
|
|
8
|
-
/Violation of PRIMARY KEY constraint '(.+)'\. Cannot insert duplicate key in object '(.+)\.(.+)'\. The duplicate key value is \((.+)\)/;
|
|
9
|
-
|
|
10
|
-
function wrapDbError(err) {
|
|
11
|
-
// tedious throws an AggregateError with an empty message when SQL Server
|
|
12
|
-
// reports several errors for one statement, and knex only prepends the SQL to
|
|
13
|
-
// it. Add the messages of its errors, to give the reasons.
|
|
14
|
-
if (isTediousAggregateError(err)) {
|
|
15
|
-
const wrapped = new DBError({ nativeError: err, client: 'mssql' });
|
|
16
|
-
wrapped.message += err.errors.map((error) => error.message).join(' ');
|
|
17
|
-
return wrapped;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if (!isTediousError(err)) {
|
|
21
|
-
return wrapError(err);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// db-errors parses the errors of the `mssql` package, which wraps the errors
|
|
25
|
-
// of tedious and keeps their number and class in `originalError.info`. knex
|
|
26
|
-
// uses tedious directly, so its errors are passed on in that shape.
|
|
27
|
-
const wrapped = wrapError({
|
|
28
|
-
code: err.code,
|
|
29
|
-
originalError: { message: err.message, info: { number: err.number, class: err.class } },
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
if (!(wrapped instanceof DBError)) {
|
|
33
|
-
return err;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
wrapped.nativeError = err;
|
|
37
|
-
|
|
38
|
-
const match = wrapped.constructor === DBError && MSSQL_PRIMARY_KEY_REGEX.exec(err.message);
|
|
39
|
-
|
|
40
|
-
if (match) {
|
|
41
|
-
return new UniqueViolationError({
|
|
42
|
-
nativeError: err,
|
|
43
|
-
client: 'mssql',
|
|
44
|
-
table: match[3],
|
|
45
|
-
schema: match[2],
|
|
46
|
-
constraint: match[1],
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return wrapped;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function isTediousError(err) {
|
|
54
|
-
return err?.code === 'EREQUEST' && Number.isInteger(err.number);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Check the name, as AggregateError isn't defined on Node 14.
|
|
58
|
-
function isTediousAggregateError(err) {
|
|
59
|
-
return err?.name === 'AggregateError' && err.errors.every(isTediousError);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
module.exports = {
|
|
63
|
-
wrapDbError,
|
|
64
|
-
};
|