@antelopejs/postgres 0.0.1-stage → 0.2.0
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/LICENSE +190 -0
- package/README.md +152 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.js +90 -0
- package/dist/config.js.map +1 -0
- package/dist/connection.d.ts +14 -0
- package/dist/connection.js +128 -0
- package/dist/connection.js.map +1 -0
- package/dist/implementations/database/changes.d.ts +19 -0
- package/dist/implementations/database/changes.js +100 -0
- package/dist/implementations/database/changes.js.map +1 -0
- package/dist/implementations/database/coerce.d.ts +15 -0
- package/dist/implementations/database/coerce.js +195 -0
- package/dist/implementations/database/coerce.js.map +1 -0
- package/dist/implementations/database/context.d.ts +32 -0
- package/dist/implementations/database/context.js +50 -0
- package/dist/implementations/database/context.js.map +1 -0
- package/dist/implementations/database/cursors.d.ts +16 -0
- package/dist/implementations/database/cursors.js +269 -0
- package/dist/implementations/database/cursors.js.map +1 -0
- package/dist/implementations/database/ddl.d.ts +62 -0
- package/dist/implementations/database/ddl.js +355 -0
- package/dist/implementations/database/ddl.js.map +1 -0
- package/dist/implementations/database/expression.d.ts +7 -0
- package/dist/implementations/database/expression.js +30 -0
- package/dist/implementations/database/expression.js.map +1 -0
- package/dist/implementations/database/external-catalog.d.ts +22 -0
- package/dist/implementations/database/external-catalog.js +82 -0
- package/dist/implementations/database/external-catalog.js.map +1 -0
- package/dist/implementations/database/external-errors.d.ts +20 -0
- package/dist/implementations/database/external-errors.js +67 -0
- package/dist/implementations/database/external-errors.js.map +1 -0
- package/dist/implementations/database/external-payload.d.ts +32 -0
- package/dist/implementations/database/external-payload.js +206 -0
- package/dist/implementations/database/external-payload.js.map +1 -0
- package/dist/implementations/database/external-refusals.d.ts +5 -0
- package/dist/implementations/database/external-refusals.js +23 -0
- package/dist/implementations/database/external-refusals.js.map +1 -0
- package/dist/implementations/database/external-schema.d.ts +3 -0
- package/dist/implementations/database/external-schema.js +121 -0
- package/dist/implementations/database/external-schema.js.map +1 -0
- package/dist/implementations/database/external-types.d.ts +29 -0
- package/dist/implementations/database/external-types.js +373 -0
- package/dist/implementations/database/external-types.js.map +1 -0
- package/dist/implementations/database/external-writes.d.ts +3 -0
- package/dist/implementations/database/external-writes.js +298 -0
- package/dist/implementations/database/external-writes.js.map +1 -0
- package/dist/implementations/database/feed-pipeline.d.ts +12 -0
- package/dist/implementations/database/feed-pipeline.js +92 -0
- package/dist/implementations/database/feed-pipeline.js.map +1 -0
- package/dist/implementations/database/feeds.d.ts +34 -0
- package/dist/implementations/database/feeds.js +338 -0
- package/dist/implementations/database/feeds.js.map +1 -0
- package/dist/implementations/database/fields.d.ts +37 -0
- package/dist/implementations/database/fields.js +114 -0
- package/dist/implementations/database/fields.js.map +1 -0
- package/dist/implementations/database/identifier.d.ts +8 -0
- package/dist/implementations/database/identifier.js +62 -0
- package/dist/implementations/database/identifier.js.map +1 -0
- package/dist/implementations/database/instances.d.ts +4 -0
- package/dist/implementations/database/instances.js +57 -0
- package/dist/implementations/database/instances.js.map +1 -0
- package/dist/implementations/database/introspect.d.ts +3 -0
- package/dist/implementations/database/introspect.js +36 -0
- package/dist/implementations/database/introspect.js.map +1 -0
- package/dist/implementations/database/jsonb.d.ts +29 -0
- package/dist/implementations/database/jsonb.js +54 -0
- package/dist/implementations/database/jsonb.js.map +1 -0
- package/dist/implementations/database/listener.d.ts +3 -0
- package/dist/implementations/database/listener.js +93 -0
- package/dist/implementations/database/listener.js.map +1 -0
- package/dist/implementations/database/migrate.d.ts +6 -0
- package/dist/implementations/database/migrate.js +282 -0
- package/dist/implementations/database/migrate.js.map +1 -0
- package/dist/implementations/database/payload.d.ts +24 -0
- package/dist/implementations/database/payload.js +113 -0
- package/dist/implementations/database/payload.js.map +1 -0
- package/dist/implementations/database/pipeline.d.ts +10 -0
- package/dist/implementations/database/pipeline.js +56 -0
- package/dist/implementations/database/pipeline.js.map +1 -0
- package/dist/implementations/database/query.d.ts +11 -0
- package/dist/implementations/database/query.js +189 -0
- package/dist/implementations/database/query.js.map +1 -0
- package/dist/implementations/database/readings.d.ts +17 -0
- package/dist/implementations/database/readings.js +133 -0
- package/dist/implementations/database/readings.js.map +1 -0
- package/dist/implementations/database/reaper.d.ts +6 -0
- package/dist/implementations/database/reaper.js +121 -0
- package/dist/implementations/database/reaper.js.map +1 -0
- package/dist/implementations/database/relation.d.ts +65 -0
- package/dist/implementations/database/relation.js +237 -0
- package/dist/implementations/database/relation.js.map +1 -0
- package/dist/implementations/database/result.d.ts +4 -0
- package/dist/implementations/database/result.js +70 -0
- package/dist/implementations/database/result.js.map +1 -0
- package/dist/implementations/database/row-source.d.ts +64 -0
- package/dist/implementations/database/row-source.js +279 -0
- package/dist/implementations/database/row-source.js.map +1 -0
- package/dist/implementations/database/schema.d.ts +15 -0
- package/dist/implementations/database/schema.js +143 -0
- package/dist/implementations/database/schema.js.map +1 -0
- package/dist/implementations/database/selection.d.ts +18 -0
- package/dist/implementations/database/selection.js +129 -0
- package/dist/implementations/database/selection.js.map +1 -0
- package/dist/implementations/database/sql.d.ts +24 -0
- package/dist/implementations/database/sql.js +48 -0
- package/dist/implementations/database/sql.js.map +1 -0
- package/dist/implementations/database/stage.d.ts +22 -0
- package/dist/implementations/database/stage.js +76 -0
- package/dist/implementations/database/stage.js.map +1 -0
- package/dist/implementations/database/stages-aggregate.d.ts +11 -0
- package/dist/implementations/database/stages-aggregate.js +112 -0
- package/dist/implementations/database/stages-aggregate.js.map +1 -0
- package/dist/implementations/database/stages-array.d.ts +2 -0
- package/dist/implementations/database/stages-array.js +162 -0
- package/dist/implementations/database/stages-array.js.map +1 -0
- package/dist/implementations/database/stages-core.d.ts +2 -0
- package/dist/implementations/database/stages-core.js +107 -0
- package/dist/implementations/database/stages-core.js.map +1 -0
- package/dist/implementations/database/stages-date.d.ts +2 -0
- package/dist/implementations/database/stages-date.js +65 -0
- package/dist/implementations/database/stages-date.js.map +1 -0
- package/dist/implementations/database/stages-group.d.ts +5 -0
- package/dist/implementations/database/stages-group.js +151 -0
- package/dist/implementations/database/stages-group.js.map +1 -0
- package/dist/implementations/database/stages-join.d.ts +2 -0
- package/dist/implementations/database/stages-join.js +162 -0
- package/dist/implementations/database/stages-join.js.map +1 -0
- package/dist/implementations/database/stages-numeric.d.ts +2 -0
- package/dist/implementations/database/stages-numeric.js +152 -0
- package/dist/implementations/database/stages-numeric.js.map +1 -0
- package/dist/implementations/database/stages-object.d.ts +2 -0
- package/dist/implementations/database/stages-object.js +81 -0
- package/dist/implementations/database/stages-object.js.map +1 -0
- package/dist/implementations/database/stages-projection.d.ts +2 -0
- package/dist/implementations/database/stages-projection.js +75 -0
- package/dist/implementations/database/stages-projection.js.map +1 -0
- package/dist/implementations/database/stages-rows.d.ts +2 -0
- package/dist/implementations/database/stages-rows.js +101 -0
- package/dist/implementations/database/stages-rows.js.map +1 -0
- package/dist/implementations/database/stages-selection.d.ts +2 -0
- package/dist/implementations/database/stages-selection.js +146 -0
- package/dist/implementations/database/stages-selection.js.map +1 -0
- package/dist/implementations/database/stages-string.d.ts +2 -0
- package/dist/implementations/database/stages-string.js +101 -0
- package/dist/implementations/database/stages-string.js.map +1 -0
- package/dist/implementations/database/subquery.d.ts +4 -0
- package/dist/implementations/database/subquery.js +49 -0
- package/dist/implementations/database/subquery.js.map +1 -0
- package/dist/implementations/database/types.d.ts +37 -0
- package/dist/implementations/database/types.js +57 -0
- package/dist/implementations/database/types.js.map +1 -0
- package/dist/implementations/database/utils.d.ts +16 -0
- package/dist/implementations/database/utils.js +38 -0
- package/dist/implementations/database/utils.js.map +1 -0
- package/dist/implementations/database/value.d.ts +10 -0
- package/dist/implementations/database/value.js +153 -0
- package/dist/implementations/database/value.js.map +1 -0
- package/dist/implementations/database/writes-atomic.d.ts +6 -0
- package/dist/implementations/database/writes-atomic.js +93 -0
- package/dist/implementations/database/writes-atomic.js.map +1 -0
- package/dist/implementations/database/writes-identity.d.ts +4 -0
- package/dist/implementations/database/writes-identity.js +181 -0
- package/dist/implementations/database/writes-identity.js.map +1 -0
- package/dist/implementations/database/writes-insert.d.ts +2 -0
- package/dist/implementations/database/writes-insert.js +136 -0
- package/dist/implementations/database/writes-insert.js.map +1 -0
- package/dist/implementations/database/writes-shared.d.ts +36 -0
- package/dist/implementations/database/writes-shared.js +64 -0
- package/dist/implementations/database/writes-shared.js.map +1 -0
- package/dist/implementations/database/writes.d.ts +16 -0
- package/dist/implementations/database/writes.js +52 -0
- package/dist/implementations/database/writes.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.js +6 -0
- package/dist/logger.js.map +1 -0
- package/dist/test/antelope.test.d.ts +2 -0
- package/dist/test/antelope.test.js +88 -0
- package/dist/test/antelope.test.js.map +1 -0
- package/dist/test/atomic.test.d.ts +1 -0
- package/dist/test/atomic.test.js +132 -0
- package/dist/test/atomic.test.js.map +1 -0
- package/dist/test/contention.test.d.ts +1 -0
- package/dist/test/contention.test.js +183 -0
- package/dist/test/contention.test.js.map +1 -0
- package/dist/test/indexes.test.d.ts +1 -0
- package/dist/test/indexes.test.js +311 -0
- package/dist/test/indexes.test.js.map +1 -0
- package/dist/test/unit/changes.spec.d.ts +1 -0
- package/dist/test/unit/changes.spec.js +103 -0
- package/dist/test/unit/changes.spec.js.map +1 -0
- package/dist/test/unit/coerce.spec.d.ts +1 -0
- package/dist/test/unit/coerce.spec.js +162 -0
- package/dist/test/unit/coerce.spec.js.map +1 -0
- package/dist/test/unit/config.spec.d.ts +1 -0
- package/dist/test/unit/config.spec.js +123 -0
- package/dist/test/unit/config.spec.js.map +1 -0
- package/dist/test/unit/connection.spec.d.ts +1 -0
- package/dist/test/unit/connection.spec.js +171 -0
- package/dist/test/unit/connection.spec.js.map +1 -0
- package/dist/test/unit/cursors.spec.d.ts +1 -0
- package/dist/test/unit/cursors.spec.js +823 -0
- package/dist/test/unit/cursors.spec.js.map +1 -0
- package/dist/test/unit/ddl.spec.d.ts +1 -0
- package/dist/test/unit/ddl.spec.js +571 -0
- package/dist/test/unit/ddl.spec.js.map +1 -0
- package/dist/test/unit/expression-array.spec.d.ts +1 -0
- package/dist/test/unit/expression-array.spec.js +488 -0
- package/dist/test/unit/expression-array.spec.js.map +1 -0
- package/dist/test/unit/expression-date.spec.d.ts +1 -0
- package/dist/test/unit/expression-date.spec.js +329 -0
- package/dist/test/unit/expression-date.spec.js.map +1 -0
- package/dist/test/unit/expression-numeric.spec.d.ts +1 -0
- package/dist/test/unit/expression-numeric.spec.js +362 -0
- package/dist/test/unit/expression-numeric.spec.js.map +1 -0
- package/dist/test/unit/expression-object.spec.d.ts +1 -0
- package/dist/test/unit/expression-object.spec.js +230 -0
- package/dist/test/unit/expression-object.spec.js.map +1 -0
- package/dist/test/unit/expression-stages.spec.d.ts +1 -0
- package/dist/test/unit/expression-stages.spec.js +82 -0
- package/dist/test/unit/expression-stages.spec.js.map +1 -0
- package/dist/test/unit/expression-string.spec.d.ts +1 -0
- package/dist/test/unit/expression-string.spec.js +249 -0
- package/dist/test/unit/expression-string.spec.js.map +1 -0
- package/dist/test/unit/expression.spec.d.ts +1 -0
- package/dist/test/unit/expression.spec.js +449 -0
- package/dist/test/unit/expression.spec.js.map +1 -0
- package/dist/test/unit/external-comparisons.spec.d.ts +1 -0
- package/dist/test/unit/external-comparisons.spec.js +145 -0
- package/dist/test/unit/external-comparisons.spec.js.map +1 -0
- package/dist/test/unit/external-types.spec.d.ts +1 -0
- package/dist/test/unit/external-types.spec.js +191 -0
- package/dist/test/unit/external-types.spec.js.map +1 -0
- package/dist/test/unit/feeds.spec.d.ts +1 -0
- package/dist/test/unit/feeds.spec.js +374 -0
- package/dist/test/unit/feeds.spec.js.map +1 -0
- package/dist/test/unit/fields.spec.d.ts +1 -0
- package/dist/test/unit/fields.spec.js +79 -0
- package/dist/test/unit/fields.spec.js.map +1 -0
- package/dist/test/unit/identifier.spec.d.ts +1 -0
- package/dist/test/unit/identifier.spec.js +50 -0
- package/dist/test/unit/identifier.spec.js.map +1 -0
- package/dist/test/unit/payload.spec.d.ts +1 -0
- package/dist/test/unit/payload.spec.js +278 -0
- package/dist/test/unit/payload.spec.js.map +1 -0
- package/dist/test/unit/pipeline-aggregate.spec.d.ts +1 -0
- package/dist/test/unit/pipeline-aggregate.spec.js +199 -0
- package/dist/test/unit/pipeline-aggregate.spec.js.map +1 -0
- package/dist/test/unit/pipeline-fixture.d.ts +79 -0
- package/dist/test/unit/pipeline-fixture.js +277 -0
- package/dist/test/unit/pipeline-fixture.js.map +1 -0
- package/dist/test/unit/pipeline-group.spec.d.ts +1 -0
- package/dist/test/unit/pipeline-group.spec.js +390 -0
- package/dist/test/unit/pipeline-group.spec.js.map +1 -0
- package/dist/test/unit/pipeline-join.spec.d.ts +1 -0
- package/dist/test/unit/pipeline-join.spec.js +165 -0
- package/dist/test/unit/pipeline-join.spec.js.map +1 -0
- package/dist/test/unit/pipeline-lookup.spec.d.ts +1 -0
- package/dist/test/unit/pipeline-lookup.spec.js +268 -0
- package/dist/test/unit/pipeline-lookup.spec.js.map +1 -0
- package/dist/test/unit/pipeline-projection.spec.d.ts +1 -0
- package/dist/test/unit/pipeline-projection.spec.js +183 -0
- package/dist/test/unit/pipeline-projection.spec.js.map +1 -0
- package/dist/test/unit/pipeline-rows.spec.d.ts +1 -0
- package/dist/test/unit/pipeline-rows.spec.js +321 -0
- package/dist/test/unit/pipeline-rows.spec.js.map +1 -0
- package/dist/test/unit/pipeline-selection.spec.d.ts +1 -0
- package/dist/test/unit/pipeline-selection.spec.js +257 -0
- package/dist/test/unit/pipeline-selection.spec.js.map +1 -0
- package/dist/test/unit/pipeline-stages.spec.d.ts +1 -0
- package/dist/test/unit/pipeline-stages.spec.js +226 -0
- package/dist/test/unit/pipeline-stages.spec.js.map +1 -0
- package/dist/test/unit/pipeline.spec.d.ts +1 -0
- package/dist/test/unit/pipeline.spec.js +72 -0
- package/dist/test/unit/pipeline.spec.js.map +1 -0
- package/dist/test/unit/query.spec.d.ts +1 -0
- package/dist/test/unit/query.spec.js +212 -0
- package/dist/test/unit/query.spec.js.map +1 -0
- package/dist/test/unit/reaper.spec.d.ts +1 -0
- package/dist/test/unit/reaper.spec.js +122 -0
- package/dist/test/unit/reaper.spec.js.map +1 -0
- package/dist/test/unit/relation.spec.d.ts +1 -0
- package/dist/test/unit/relation.spec.js +348 -0
- package/dist/test/unit/relation.spec.js.map +1 -0
- package/dist/test/unit/result.spec.d.ts +1 -0
- package/dist/test/unit/result.spec.js +128 -0
- package/dist/test/unit/result.spec.js.map +1 -0
- package/dist/test/unit/row-source.spec.d.ts +1 -0
- package/dist/test/unit/row-source.spec.js +141 -0
- package/dist/test/unit/row-source.spec.js.map +1 -0
- package/dist/test/unit/schema.spec.d.ts +1 -0
- package/dist/test/unit/schema.spec.js +44 -0
- package/dist/test/unit/schema.spec.js.map +1 -0
- package/dist/test/unit/selection.spec.d.ts +1 -0
- package/dist/test/unit/selection.spec.js +182 -0
- package/dist/test/unit/selection.spec.js.map +1 -0
- package/dist/test/unit/spec-fixture.d.ts +11 -0
- package/dist/test/unit/spec-fixture.js +71 -0
- package/dist/test/unit/spec-fixture.js.map +1 -0
- package/dist/test/unit/sql.spec.d.ts +1 -0
- package/dist/test/unit/sql.spec.js +38 -0
- package/dist/test/unit/sql.spec.js.map +1 -0
- package/dist/test/unit/subquery.spec.d.ts +1 -0
- package/dist/test/unit/subquery.spec.js +154 -0
- package/dist/test/unit/subquery.spec.js.map +1 -0
- package/dist/test/unit/types.spec.d.ts +1 -0
- package/dist/test/unit/types.spec.js +39 -0
- package/dist/test/unit/types.spec.js.map +1 -0
- package/dist/test/unit/utils.spec.d.ts +1 -0
- package/dist/test/unit/utils.spec.js +22 -0
- package/dist/test/unit/utils.spec.js.map +1 -0
- package/dist/test/unit/value.spec.d.ts +1 -0
- package/dist/test/unit/value.spec.js +195 -0
- package/dist/test/unit/value.spec.js.map +1 -0
- package/dist/test/unit/writes-atomic.spec.d.ts +1 -0
- package/dist/test/unit/writes-atomic.spec.js +66 -0
- package/dist/test/unit/writes-atomic.spec.js.map +1 -0
- package/dist/test/unit/writes-insert.spec.d.ts +1 -0
- package/dist/test/unit/writes-insert.spec.js +270 -0
- package/dist/test/unit/writes-insert.spec.js.map +1 -0
- package/dist/test/unit/writes-replace.spec.d.ts +1 -0
- package/dist/test/unit/writes-replace.spec.js +100 -0
- package/dist/test/unit/writes-replace.spec.js.map +1 -0
- package/dist/test/unit/writes-target.spec.d.ts +1 -0
- package/dist/test/unit/writes-target.spec.js +118 -0
- package/dist/test/unit/writes-target.spec.js.map +1 -0
- package/dist/test/unit/writes-update.spec.d.ts +1 -0
- package/dist/test/unit/writes-update.spec.js +297 -0
- package/dist/test/unit/writes-update.spec.js.map +1 -0
- package/dist/test-external/fixture.d.ts +6 -0
- package/dist/test-external/fixture.js +136 -0
- package/dist/test-external/fixture.js.map +1 -0
- package/dist/test-external/native.test.d.ts +1 -0
- package/dist/test-external/native.test.js +132 -0
- package/dist/test-external/native.test.js.map +1 -0
- package/dist/test-external/reads.test.d.ts +1 -0
- package/dist/test-external/reads.test.js +232 -0
- package/dist/test-external/reads.test.js.map +1 -0
- package/dist/test-external/refusals.test.d.ts +1 -0
- package/dist/test-external/refusals.test.js +93 -0
- package/dist/test-external/refusals.test.js.map +1 -0
- package/dist/test-external/registration.test.d.ts +1 -0
- package/dist/test-external/registration.test.js +127 -0
- package/dist/test-external/registration.test.js.map +1 -0
- package/dist/test-external/sales.d.ts +5 -0
- package/dist/test-external/sales.js +126 -0
- package/dist/test-external/sales.js.map +1 -0
- package/dist/test-external/startup.test.d.ts +1 -0
- package/dist/test-external/startup.test.js +15 -0
- package/dist/test-external/startup.test.js.map +1 -0
- package/dist/test-external/writes.test.d.ts +1 -0
- package/dist/test-external/writes.test.js +315 -0
- package/dist/test-external/writes.test.js.map +1 -0
- package/package.json +75 -7
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const interface_database_1 = require("@antelopejs/interface-database");
|
|
5
|
+
const common_1 = require("@antelopejs/interface-database/common");
|
|
6
|
+
const spec_fixture_1 = require("./spec-fixture");
|
|
7
|
+
const stage_1 = require("../../implementations/database/stage");
|
|
8
|
+
const context_1 = require("../../implementations/database/context");
|
|
9
|
+
const expression_1 = require("../../implementations/database/expression");
|
|
10
|
+
const row_source_1 = require("../../implementations/database/row-source");
|
|
11
|
+
const types_1 = require("../../implementations/database/types");
|
|
12
|
+
const LAMBDA_ID_FLOOR = 0;
|
|
13
|
+
const ROW_ID = LAMBDA_ID_FLOOR - 1;
|
|
14
|
+
const users = {
|
|
15
|
+
fields: {
|
|
16
|
+
age: { column: "age", type: types_1.FLOAT },
|
|
17
|
+
name: { column: "name", type: types_1.TEXT },
|
|
18
|
+
isActive: { column: "isActive", type: types_1.BOOL },
|
|
19
|
+
createdAt: { column: "createdAt", type: types_1.TIMESTAMP },
|
|
20
|
+
tags: { column: "tags", type: (0, types_1.ArrayOf)(types_1.TEXT) },
|
|
21
|
+
metadata: { column: "metadata", type: (0, types_1.JsonOf)({ level: types_1.FLOAT }) },
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
function NewContext() {
|
|
25
|
+
const context = new context_1.DecodingContext({
|
|
26
|
+
...(0, spec_fixture_1.RefusingCompilers)(),
|
|
27
|
+
expression: expression_1.CompileExpression,
|
|
28
|
+
});
|
|
29
|
+
context.bind(ROW_ID, new row_source_1.ColumnRowSource((0, row_source_1.AliasedColumns)("t"), users));
|
|
30
|
+
return context;
|
|
31
|
+
}
|
|
32
|
+
function Compile(build) {
|
|
33
|
+
return (0, expression_1.CompileExpression)(build(interface_database_1.ValueProxy.arg(ROW_ID)).build(), NewContext());
|
|
34
|
+
}
|
|
35
|
+
const AGE = `"t"."age"`;
|
|
36
|
+
const NAME = `"t"."name"`;
|
|
37
|
+
const ACTIVE = `"t"."isActive"`;
|
|
38
|
+
const CREATED = `"t"."createdAt"`;
|
|
39
|
+
const METADATA = `"t"."metadata"`;
|
|
40
|
+
const FLOAT_PARAM = "($1::double precision)";
|
|
41
|
+
const TEXT_PARAM = "($1::text)";
|
|
42
|
+
const SECONDS = "interval '1 second'";
|
|
43
|
+
function Extra(key) {
|
|
44
|
+
return `("t"."_extra" -> '${key}')`;
|
|
45
|
+
}
|
|
46
|
+
function AsNumber(sql) {
|
|
47
|
+
return `(CASE WHEN jsonb_typeof(${sql}) = 'number' THEN ((${sql} #>> '{}')::double precision) END)`;
|
|
48
|
+
}
|
|
49
|
+
function AsText(sql) {
|
|
50
|
+
return `(CASE WHEN jsonb_typeof(${sql}) = 'string' THEN (${sql} #>> '{}') END)`;
|
|
51
|
+
}
|
|
52
|
+
const NUMERIC_TEXT_PATTERN = "'^\\s*[+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([eE][+-]?[0-9]+)?\\s*$'";
|
|
53
|
+
function AsNumericText(sql) {
|
|
54
|
+
return `(CASE WHEN ${sql} ~ ${NUMERIC_TEXT_PATTERN} THEN ((${sql})::double precision) END)`;
|
|
55
|
+
}
|
|
56
|
+
function Finite(sql) {
|
|
57
|
+
return `NULLIF(NULLIF(NULLIF(${sql}, 'NaN'::float8), 'Infinity'::float8), '-Infinity'::float8)`;
|
|
58
|
+
}
|
|
59
|
+
function Int32(sql) {
|
|
60
|
+
return `(mod(trunc(${Finite(sql)})::numeric, 4294967296::numeric)::bigint::bit(32)::int)`;
|
|
61
|
+
}
|
|
62
|
+
function Uint32(sql) {
|
|
63
|
+
return `(${Int32(sql)}::bigint & 4294967295)`;
|
|
64
|
+
}
|
|
65
|
+
function ShiftCount(sql) {
|
|
66
|
+
return `(${Int32(sql)} & 31)`;
|
|
67
|
+
}
|
|
68
|
+
function AsFloat(sql) {
|
|
69
|
+
return `((${sql})::double precision)`;
|
|
70
|
+
}
|
|
71
|
+
describe("numeric stage dispatch", () => {
|
|
72
|
+
it("exposes every numeric stage it can dispatch", () => {
|
|
73
|
+
(0, chai_1.expect)(Object.keys(expression_1.STAGES)).to.include.members([
|
|
74
|
+
"add",
|
|
75
|
+
"sub",
|
|
76
|
+
"mul",
|
|
77
|
+
"div",
|
|
78
|
+
"mod",
|
|
79
|
+
"round",
|
|
80
|
+
"ceil",
|
|
81
|
+
"floor",
|
|
82
|
+
"bit_and",
|
|
83
|
+
"bit_or",
|
|
84
|
+
"bit_xor",
|
|
85
|
+
"bit_not",
|
|
86
|
+
"bit_lshift",
|
|
87
|
+
"bit_rshift",
|
|
88
|
+
]);
|
|
89
|
+
});
|
|
90
|
+
it("clears a pending timezone", () => {
|
|
91
|
+
const out = expression_1.STAGES.round({ current: { sql: AGE, type: types_1.FLOAT }, timezone: "'UTC'" }, (0, common_1.QueryStage)("round"), NewContext());
|
|
92
|
+
(0, chai_1.expect)(out.timezone).to.equal(undefined);
|
|
93
|
+
});
|
|
94
|
+
it("names the stage when the second operand is absent", () => {
|
|
95
|
+
const binary = [
|
|
96
|
+
"add",
|
|
97
|
+
"sub",
|
|
98
|
+
"mul",
|
|
99
|
+
"div",
|
|
100
|
+
"mod",
|
|
101
|
+
"bit_and",
|
|
102
|
+
"bit_or",
|
|
103
|
+
"bit_xor",
|
|
104
|
+
"bit_lshift",
|
|
105
|
+
"bit_rshift",
|
|
106
|
+
];
|
|
107
|
+
for (const name of binary) {
|
|
108
|
+
(0, chai_1.expect)(() => (0, expression_1.CompileExpression)([(0, common_1.QueryStage)("arg", undefined, ROW_ID), (0, common_1.QueryStage)(name)], NewContext())).to.throw(`'${name}'`);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe("add", () => {
|
|
113
|
+
it("adds two numbers without materializing the row", () => {
|
|
114
|
+
const out = Compile((doc) => doc.key("age").add(5));
|
|
115
|
+
(0, chai_1.expect)(out.sql).to.equal(`(${AGE} + ${FLOAT_PARAM})`);
|
|
116
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.FLOAT);
|
|
117
|
+
(0, chai_1.expect)(out.sql).to.not.contain("jsonb");
|
|
118
|
+
});
|
|
119
|
+
it("reads a number added to a date as seconds", () => {
|
|
120
|
+
const out = Compile((doc) => doc.key("createdAt").add(3600));
|
|
121
|
+
(0, chai_1.expect)(out.sql).to.equal(`("t"."createdAt" + (${FLOAT_PARAM}) * ${SECONDS})`);
|
|
122
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.TIMESTAMP);
|
|
123
|
+
});
|
|
124
|
+
it("reads the same offset with the operands the other way round", () => {
|
|
125
|
+
const out = (0, expression_1.CompileExpression)(interface_database_1.ValueProxy.constant(3600)
|
|
126
|
+
.add(interface_database_1.ValueProxy.arg(ROW_ID).key("createdAt"))
|
|
127
|
+
.build(), NewContext());
|
|
128
|
+
(0, chai_1.expect)(out.sql).to.equal(`("t"."createdAt" + (${FLOAT_PARAM}) * ${SECONDS})`);
|
|
129
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.TIMESTAMP);
|
|
130
|
+
});
|
|
131
|
+
it("concatenates two strings", () => {
|
|
132
|
+
const out = Compile((doc) => doc.key("name").add("!"));
|
|
133
|
+
(0, chai_1.expect)(out.sql).to.equal(`("t"."name" || ($1::text))`);
|
|
134
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.TEXT);
|
|
135
|
+
});
|
|
136
|
+
it("concatenates two arrays and keeps the element type", () => {
|
|
137
|
+
const out = Compile((doc) => doc.key("tags").add(["x"]));
|
|
138
|
+
(0, chai_1.expect)(out.sql).to.equal(`("t"."tags" || ($1::jsonb))`);
|
|
139
|
+
(0, chai_1.expect)(out.type).to.deep.equal((0, types_1.ArrayOf)(types_1.TEXT));
|
|
140
|
+
});
|
|
141
|
+
it("rejects two dates, naming the stage", () => {
|
|
142
|
+
(0, chai_1.expect)(() => Compile((doc) => doc.key("createdAt").add(new Date()))).to.throw(/Stage 'add' has no reading for a 'timestamp' and a 'timestamp'/);
|
|
143
|
+
});
|
|
144
|
+
it("pulls an undeclared key toward the kind of the other operand", () => {
|
|
145
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("nope").add("x")).sql).to.equal(`(${AsText(Extra("nope"))} || ${TEXT_PARAM})`);
|
|
146
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("nope").add(5)).sql).to.equal(`(${AsNumber(Extra("nope"))} + ${FLOAT_PARAM})`);
|
|
147
|
+
});
|
|
148
|
+
it("reads an undeclared key added to a date as seconds, in either order", () => {
|
|
149
|
+
const offset = `(${CREATED} + (${AsNumber(Extra("nope"))}) * ${SECONDS})`;
|
|
150
|
+
const forward = Compile((doc) => doc.key("createdAt").add(doc.key("nope")));
|
|
151
|
+
(0, chai_1.expect)(forward.sql).to.equal(offset);
|
|
152
|
+
(0, chai_1.expect)(forward.type).to.equal(types_1.TIMESTAMP);
|
|
153
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("nope").add(doc.key("createdAt"))).sql).to.equal(offset);
|
|
154
|
+
});
|
|
155
|
+
it("reads a null added to a date as seconds rather than rejecting the pair", () => {
|
|
156
|
+
const out = Compile((doc) => doc.key("createdAt").add(null));
|
|
157
|
+
(0, chai_1.expect)(out.sql).to.equal(`(${CREATED} + (${AsNumber("'null'::jsonb")}) * ${SECONDS})`);
|
|
158
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.TIMESTAMP);
|
|
159
|
+
});
|
|
160
|
+
it("pulls a shaped json operand toward the other kind, as it does an opaque one", () => {
|
|
161
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("metadata").add("x")).sql).to.equal(`(${AsText(METADATA)} || ${TEXT_PARAM})`);
|
|
162
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("metadata").add(doc.key("createdAt")))
|
|
163
|
+
.sql).to.equal(`(${CREATED} + (${AsNumber(METADATA)}) * ${SECONDS})`);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe("sub", () => {
|
|
167
|
+
it("subtracts two numbers", () => {
|
|
168
|
+
const out = Compile((doc) => doc.key("age").sub(5));
|
|
169
|
+
(0, chai_1.expect)(out.sql).to.equal(`(${AGE} - ${FLOAT_PARAM})`);
|
|
170
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.FLOAT);
|
|
171
|
+
});
|
|
172
|
+
it("reads a number subtracted from a date as seconds", () => {
|
|
173
|
+
const out = Compile((doc) => doc.key("createdAt").sub(3600));
|
|
174
|
+
(0, chai_1.expect)(out.sql).to.equal(`("t"."createdAt" - (${FLOAT_PARAM}) * ${SECONDS})`);
|
|
175
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.TIMESTAMP);
|
|
176
|
+
});
|
|
177
|
+
it("reads the difference of two dates as seconds", () => {
|
|
178
|
+
const out = Compile((doc) => doc.key("createdAt").sub(new Date("2023-01-15T00:00:00Z")));
|
|
179
|
+
(0, chai_1.expect)(out.sql).to.equal(`(EXTRACT(EPOCH FROM ("t"."createdAt" - ($1::timestamptz)))::double precision)`);
|
|
180
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.FLOAT);
|
|
181
|
+
});
|
|
182
|
+
it("reads an undeclared key subtracted from a date as seconds", () => {
|
|
183
|
+
const out = Compile((doc) => doc.key("createdAt").sub(doc.key("nope")));
|
|
184
|
+
(0, chai_1.expect)(out.sql).to.equal(`(${CREATED} - (${AsNumber(Extra("nope"))}) * ${SECONDS})`);
|
|
185
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.TIMESTAMP);
|
|
186
|
+
});
|
|
187
|
+
it("names the kinds it dispatched on, not the kinds it was given", () => {
|
|
188
|
+
(0, chai_1.expect)(() => Compile((doc) => doc.key("nope").sub(doc.key("createdAt")))).to.throw(/Stage 'sub' has no reading for a 'float' and a 'timestamp'/);
|
|
189
|
+
});
|
|
190
|
+
it("rejects the operand orders and kinds that have no reading", () => {
|
|
191
|
+
(0, chai_1.expect)(() => (0, expression_1.CompileExpression)(interface_database_1.ValueProxy.constant(5)
|
|
192
|
+
.sub(interface_database_1.ValueProxy.arg(ROW_ID).key("createdAt"))
|
|
193
|
+
.build(), NewContext())).to.throw(/Stage 'sub' has no reading for a 'float' and a 'timestamp'/);
|
|
194
|
+
(0, chai_1.expect)(() => Compile((doc) => doc.key("name").sub("x"))).to.throw(/Stage 'sub' has no reading for a 'text' and a 'text'/);
|
|
195
|
+
(0, chai_1.expect)(() => Compile((doc) => doc.key("tags").sub(["x"]))).to.throw(/Stage 'sub' has no reading for a 'array' and a 'array'/);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe("mul, div and mod", () => {
|
|
199
|
+
it("multiplies with the plain infix operator", () => {
|
|
200
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("age").mul(2)).sql).to.equal(`(${AGE} * ${FLOAT_PARAM})`);
|
|
201
|
+
});
|
|
202
|
+
it("reads a zero divisor as absent, since a bare / raises 22012 and loses the statement", () => {
|
|
203
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("age").div(2)).sql).to.equal(`(${AGE} / NULLIF(${FLOAT_PARAM}, 0))`);
|
|
204
|
+
});
|
|
205
|
+
it("routes the modulo through numeric, since double precision has no % operator", () => {
|
|
206
|
+
const out = Compile((doc) => doc.key("age").mod(10));
|
|
207
|
+
(0, chai_1.expect)(out.sql).to.equal(`(mod((${AGE})::numeric, NULLIF((${FLOAT_PARAM})::numeric, 0))::double precision)`);
|
|
208
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.FLOAT);
|
|
209
|
+
});
|
|
210
|
+
it("guards the modulo's divisor too, since mod() raises 22012 exactly as / does", () => {
|
|
211
|
+
const out = Compile((doc) => doc.key("age").mod(0));
|
|
212
|
+
(0, chai_1.expect)(out.sql).to.contain("NULLIF(");
|
|
213
|
+
(0, chai_1.expect)(out.sql).to.equal(`(mod((${AGE})::numeric, NULLIF((${FLOAT_PARAM})::numeric, 0))::double precision)`);
|
|
214
|
+
});
|
|
215
|
+
it("guards the divisor alone, leaving the dividend a bare indexable column", () => {
|
|
216
|
+
const out = Compile((doc) => doc.key("age").div(2));
|
|
217
|
+
(0, chai_1.expect)(out.sql).to.equal(`(${AGE} / NULLIF(${FLOAT_PARAM}, 0))`);
|
|
218
|
+
(0, chai_1.expect)(out.sql.indexOf("NULLIF")).to.be.greaterThan(out.sql.indexOf(`${AGE} /`));
|
|
219
|
+
});
|
|
220
|
+
it("wraps each modulo operand, since :: binds tighter than an infix operator", () => {
|
|
221
|
+
const out = Compile((doc) => doc.key("name").mod(10));
|
|
222
|
+
(0, chai_1.expect)(out.sql).to.equal(`(mod((${AsNumericText(NAME)})::numeric, NULLIF((${FLOAT_PARAM})::numeric, 0))::double precision)`);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe("the arithmetic fallback", () => {
|
|
226
|
+
it("reads a boolean operand as one or zero rather than casting it", () => {
|
|
227
|
+
const out = Compile((doc) => doc.key("isActive").add(1));
|
|
228
|
+
(0, chai_1.expect)(out.sql).to.equal(`(((${ACTIVE})::int::double precision) + ${FLOAT_PARAM})`);
|
|
229
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.FLOAT);
|
|
230
|
+
});
|
|
231
|
+
it("reads a date operand as epoch milliseconds rather than casting it", () => {
|
|
232
|
+
const out = Compile((doc) => doc.key("createdAt").mul(2));
|
|
233
|
+
(0, chai_1.expect)(out.sql).to.equal(`(((EXTRACT(EPOCH FROM ${CREATED}) * 1000)::double precision) * ${FLOAT_PARAM})`);
|
|
234
|
+
});
|
|
235
|
+
it("guards a text operand rather than letting the data decide", () => {
|
|
236
|
+
const out = Compile((doc) => doc.key("name").add(5));
|
|
237
|
+
(0, chai_1.expect)(out.sql).to.equal(`(${AsNumericText(NAME)} + ${FLOAT_PARAM})`);
|
|
238
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.FLOAT);
|
|
239
|
+
});
|
|
240
|
+
it("reduces a boolean operand for a bitwise stage too", () => {
|
|
241
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("isActive").band(1)).sql).to.equal(AsFloat(`${Int32(`((${ACTIVE})::int::double precision)`)} & ${Int32(FLOAT_PARAM)}`));
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
const ROUNDING_PROBES = [
|
|
245
|
+
{ operand: "2.5", value: 3 },
|
|
246
|
+
{ operand: "-2.5", value: -2 },
|
|
247
|
+
];
|
|
248
|
+
function RoundSql(operand) {
|
|
249
|
+
return (0, stage_1.AsValue)(expression_1.STAGES.round({ current: { sql: operand, type: types_1.FLOAT } }, (0, common_1.QueryStage)("round"), NewContext())).sql;
|
|
250
|
+
}
|
|
251
|
+
describe("round, ceil and floor", () => {
|
|
252
|
+
it("rounds half up, so 2.5 is 3 and -2.5 is -2", () => {
|
|
253
|
+
for (const probe of ROUNDING_PROBES) {
|
|
254
|
+
(0, chai_1.expect)(RoundSql(probe.operand), probe.operand).to.equal(`(floor((${probe.operand}) + 0.5))`);
|
|
255
|
+
(0, chai_1.expect)(Math.round(Number(probe.operand)), probe.operand).to.equal(probe.value);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
it("emits the half-up spelling for a column, not round()", () => {
|
|
259
|
+
const out = Compile((doc) => doc.key("age").round());
|
|
260
|
+
(0, chai_1.expect)(out.sql).to.equal(`(floor((${AGE}) + 0.5))`);
|
|
261
|
+
(0, chai_1.expect)(out.sql).to.not.contain("round(");
|
|
262
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.FLOAT);
|
|
263
|
+
});
|
|
264
|
+
it("uses the sql functions for ceil and floor", () => {
|
|
265
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("age").ceil()).sql).to.equal(`(ceil(${AGE}))`);
|
|
266
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("age").floor()).sql).to.equal(`(floor(${AGE}))`);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
const ZERO = 0;
|
|
270
|
+
const ONE = 1;
|
|
271
|
+
const THIRTY_ONE = 31;
|
|
272
|
+
const PRESERVE_SIGN = { preserveSign: true };
|
|
273
|
+
const INT32_PROBES = [
|
|
274
|
+
{
|
|
275
|
+
javascript: "1e20 | 0",
|
|
276
|
+
compute: () => 1e20 | 0,
|
|
277
|
+
value: 1661992960,
|
|
278
|
+
operand: 1e20,
|
|
279
|
+
stage: (0, common_1.QueryStage)("bit_or", undefined, ZERO),
|
|
280
|
+
sql: AsFloat(`${Int32("100000000000000000000")} | ${Int32(FLOAT_PARAM)}`),
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
javascript: "2147483648 | 0",
|
|
284
|
+
compute: () => 2147483648 | 0,
|
|
285
|
+
value: -2147483648,
|
|
286
|
+
operand: 2147483648,
|
|
287
|
+
stage: (0, common_1.QueryStage)("bit_or", undefined, ZERO),
|
|
288
|
+
sql: AsFloat(`${Int32("2147483648")} | ${Int32(FLOAT_PARAM)}`),
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
javascript: "-3.7 | 0",
|
|
292
|
+
compute: () => -3.7 | 0,
|
|
293
|
+
value: -3,
|
|
294
|
+
operand: -3.7,
|
|
295
|
+
stage: (0, common_1.QueryStage)("bit_or", undefined, ZERO),
|
|
296
|
+
sql: AsFloat(`${Int32("-3.7")} | ${Int32(FLOAT_PARAM)}`),
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
javascript: "1 << 31",
|
|
300
|
+
compute: () => 1 << 31,
|
|
301
|
+
value: -2147483648,
|
|
302
|
+
operand: 1,
|
|
303
|
+
stage: (0, common_1.QueryStage)("bit_lshift", undefined, THIRTY_ONE),
|
|
304
|
+
sql: AsFloat(`${Int32("1")} << ${ShiftCount(FLOAT_PARAM)}`),
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
javascript: "-8 >>> 1",
|
|
308
|
+
compute: () => -8 >>> 1,
|
|
309
|
+
value: 2147483644,
|
|
310
|
+
operand: -8,
|
|
311
|
+
stage: (0, common_1.QueryStage)("bit_rshift", undefined, ONE),
|
|
312
|
+
sql: AsFloat(`${Uint32("-8")} >> ${ShiftCount(FLOAT_PARAM)}`),
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
javascript: "-8 >> 1",
|
|
316
|
+
compute: () => -8 >> 1,
|
|
317
|
+
value: -4,
|
|
318
|
+
operand: -8,
|
|
319
|
+
stage: (0, common_1.QueryStage)("bit_rshift", PRESERVE_SIGN, ONE),
|
|
320
|
+
sql: AsFloat(`${Int32("-8")} >> ${ShiftCount(FLOAT_PARAM)}`),
|
|
321
|
+
},
|
|
322
|
+
];
|
|
323
|
+
function ProbeSql(probe) {
|
|
324
|
+
return (0, stage_1.AsValue)(expression_1.STAGES[probe.stage.stage]({ current: { sql: String(probe.operand), type: types_1.FLOAT } }, probe.stage, NewContext())).sql;
|
|
325
|
+
}
|
|
326
|
+
describe("bitwise stages", () => {
|
|
327
|
+
it("emits the int32 reduction for every case that distinguishes it from ::bigint", () => {
|
|
328
|
+
for (const probe of INT32_PROBES) {
|
|
329
|
+
(0, chai_1.expect)(ProbeSql(probe), probe.javascript).to.equal(probe.sql);
|
|
330
|
+
(0, chai_1.expect)(probe.compute(), probe.javascript).to.equal(probe.value);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
it("reduces an operand through trunc and a modulus, never through ::bigint", () => {
|
|
334
|
+
const out = Compile((doc) => doc.key("age").bnot());
|
|
335
|
+
(0, chai_1.expect)(out.sql).to.equal(AsFloat(`~${Int32(AGE)}`));
|
|
336
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.FLOAT);
|
|
337
|
+
});
|
|
338
|
+
it("nulls a non-finite operand, which no bigint conversion accepts", () => {
|
|
339
|
+
const out = Compile((doc) => doc.key("age").band(Number.POSITIVE_INFINITY));
|
|
340
|
+
(0, chai_1.expect)(out.sql).to.equal(AsFloat(`${Int32(AGE)} & ${Int32(FLOAT_PARAM)}`));
|
|
341
|
+
(0, chai_1.expect)(out.sql).to.contain(`NULLIF(NULLIF(NULLIF(${AGE}, 'NaN'::float8), 'Infinity'::float8), '-Infinity'::float8)`);
|
|
342
|
+
});
|
|
343
|
+
it("maps each binary operator onto its sql spelling", () => {
|
|
344
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("age").band(3)).sql).to.equal(AsFloat(`${Int32(AGE)} & ${Int32(FLOAT_PARAM)}`));
|
|
345
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("age").bor(3)).sql).to.equal(AsFloat(`${Int32(AGE)} | ${Int32(FLOAT_PARAM)}`));
|
|
346
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("age").bxor(3)).sql).to.equal(AsFloat(`${Int32(AGE)} # ${Int32(FLOAT_PARAM)}`));
|
|
347
|
+
});
|
|
348
|
+
it("masks the shift count to five bits and lets the left shift wrap", () => {
|
|
349
|
+
const out = Compile((doc) => doc.key("age").blshift(2));
|
|
350
|
+
(0, chai_1.expect)(out.sql).to.equal(AsFloat(`${Int32(AGE)} << ${ShiftCount(FLOAT_PARAM)}`));
|
|
351
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.FLOAT);
|
|
352
|
+
});
|
|
353
|
+
it("shifts right logically unless the caller asked for the sign", () => {
|
|
354
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("age").brshift(1)).sql).to.equal(AsFloat(`${Uint32(AGE)} >> ${ShiftCount(FLOAT_PARAM)}`));
|
|
355
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("age").brshiftPreserveSign(1)).sql).to.equal(AsFloat(`${Int32(AGE)} >> ${ShiftCount(FLOAT_PARAM)}`));
|
|
356
|
+
});
|
|
357
|
+
it("reads a nested json key through the guarded numeric projection", () => {
|
|
358
|
+
const level = `(CASE WHEN jsonb_typeof(("t"."metadata" -> 'level')) = 'number' THEN ((("t"."metadata" -> 'level') #>> '{}')::double precision) END)`;
|
|
359
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("metadata").key("level").band(3)).sql).to.equal(AsFloat(`${Int32(level)} & ${Int32(FLOAT_PARAM)}`));
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
//# sourceMappingURL=expression-numeric.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression-numeric.spec.js","sourceRoot":"","sources":["../../../src/test/unit/expression-numeric.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const interface_database_1 = require("@antelopejs/interface-database");
|
|
5
|
+
const common_1 = require("@antelopejs/interface-database/common");
|
|
6
|
+
const spec_fixture_1 = require("./spec-fixture");
|
|
7
|
+
const context_1 = require("../../implementations/database/context");
|
|
8
|
+
const expression_1 = require("../../implementations/database/expression");
|
|
9
|
+
const row_source_1 = require("../../implementations/database/row-source");
|
|
10
|
+
const types_1 = require("../../implementations/database/types");
|
|
11
|
+
const LAMBDA_ID_FLOOR = 0;
|
|
12
|
+
const ROW_ID = LAMBDA_ID_FLOOR - 1;
|
|
13
|
+
const OTHER_ROW_ID = LAMBDA_ID_FLOOR - 2;
|
|
14
|
+
const users = {
|
|
15
|
+
fields: {
|
|
16
|
+
age: { column: "age", type: types_1.FLOAT },
|
|
17
|
+
name: { column: "name", type: types_1.TEXT },
|
|
18
|
+
createdAt: { column: "createdAt", type: types_1.TIMESTAMP },
|
|
19
|
+
tags: { column: "tags", type: (0, types_1.ArrayOf)(types_1.TEXT) },
|
|
20
|
+
metadata: {
|
|
21
|
+
column: "metadata",
|
|
22
|
+
type: (0, types_1.JsonOf)({ level: types_1.FLOAT, since: types_1.TIMESTAMP }),
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
function NewContext() {
|
|
27
|
+
const context = new context_1.DecodingContext({
|
|
28
|
+
...(0, spec_fixture_1.RefusingCompilers)(),
|
|
29
|
+
expression: expression_1.CompileExpression,
|
|
30
|
+
});
|
|
31
|
+
context.bind(ROW_ID, new row_source_1.ColumnRowSource((0, row_source_1.AliasedColumns)("t"), users));
|
|
32
|
+
return context;
|
|
33
|
+
}
|
|
34
|
+
function Compile(build) {
|
|
35
|
+
return (0, expression_1.CompileExpression)(build(interface_database_1.ValueProxy.arg(ROW_ID)).build(), NewContext());
|
|
36
|
+
}
|
|
37
|
+
const METADATA = `"t"."metadata"`;
|
|
38
|
+
const NAME = `"t"."name"`;
|
|
39
|
+
const FLOAT_PARAM = "($1::double precision)";
|
|
40
|
+
function Guarded(operand, body) {
|
|
41
|
+
return `(CASE WHEN jsonb_typeof(${operand}) = 'object' THEN ${body} END)`;
|
|
42
|
+
}
|
|
43
|
+
function HasFields(operand, fields) {
|
|
44
|
+
return `((${operand} @> '{}'::jsonb) AND (${operand} ?& ${fields}))`;
|
|
45
|
+
}
|
|
46
|
+
function Merged(left, right, alias) {
|
|
47
|
+
const column = `"${alias}"."merged"`;
|
|
48
|
+
return `(SELECT ${column} FROM (SELECT ${left} || ${right} AS "merged") AS "${alias}" WHERE jsonb_typeof(${column}) = 'object')`;
|
|
49
|
+
}
|
|
50
|
+
function Keys(operand, alias) {
|
|
51
|
+
return `(SELECT COALESCE(jsonb_agg("${alias}"."key" ORDER BY "${alias}"."ord"), '[]'::jsonb) FROM jsonb_object_keys(${operand}) WITH ORDINALITY AS "${alias}"("key", "ord"))`;
|
|
52
|
+
}
|
|
53
|
+
function Values(operand, alias) {
|
|
54
|
+
return `(SELECT COALESCE(jsonb_agg("${alias}"."value" ORDER BY "${alias}"."ord"), '[]'::jsonb) FROM jsonb_each(${operand}) WITH ORDINALITY AS "${alias}"("key", "value", "ord"))`;
|
|
55
|
+
}
|
|
56
|
+
describe("object stage dispatch", () => {
|
|
57
|
+
it("exposes every object stage it can dispatch", () => {
|
|
58
|
+
(0, chai_1.expect)(Object.keys(expression_1.STAGES)).to.include.members([
|
|
59
|
+
"obj_index",
|
|
60
|
+
"obj_merge",
|
|
61
|
+
"obj_keys",
|
|
62
|
+
"obj_values",
|
|
63
|
+
"obj_has",
|
|
64
|
+
]);
|
|
65
|
+
});
|
|
66
|
+
it("clears a pending timezone", () => {
|
|
67
|
+
const stages = [
|
|
68
|
+
(0, common_1.QueryStage)("obj_merge", undefined, {}),
|
|
69
|
+
(0, common_1.QueryStage)("obj_keys"),
|
|
70
|
+
(0, common_1.QueryStage)("obj_values"),
|
|
71
|
+
(0, common_1.QueryStage)("obj_has", undefined, ["a"]),
|
|
72
|
+
];
|
|
73
|
+
for (const stage of stages) {
|
|
74
|
+
const out = expression_1.STAGES[stage.stage]({ current: { sql: METADATA, type: types_1.OPAQUE }, timezone: "'UTC'" }, stage, NewContext());
|
|
75
|
+
(0, chai_1.expect)(out.timezone, stage.stage).to.equal(undefined);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("obj_merge", () => {
|
|
80
|
+
it("merges two objects shallowly with the jsonb concatenation operator", () => {
|
|
81
|
+
const out = Compile((doc) => doc.key("metadata").merge({ level: 9 }));
|
|
82
|
+
const right = `jsonb_build_object('level', to_jsonb(${FLOAT_PARAM}))`;
|
|
83
|
+
(0, chai_1.expect)(out.sql).to.equal(Merged(METADATA, right, "t0"));
|
|
84
|
+
});
|
|
85
|
+
it("merges the shapes so a date survives the merge as a date", () => {
|
|
86
|
+
const out = Compile((doc) => doc.key("metadata").merge({ level: 9, extra: "x" }));
|
|
87
|
+
(0, chai_1.expect)(out.type).to.deep.equal((0, types_1.JsonOf)({ level: types_1.FLOAT, since: types_1.TIMESTAMP, extra: types_1.TEXT }));
|
|
88
|
+
});
|
|
89
|
+
it("keeps the left shape when the right side declares no member", () => {
|
|
90
|
+
const out = Compile((doc) => doc.key("metadata").merge({}));
|
|
91
|
+
(0, chai_1.expect)(out.type).to.deep.equal((0, types_1.JsonOf)({ level: types_1.FLOAT, since: types_1.TIMESTAMP }));
|
|
92
|
+
});
|
|
93
|
+
it("lets the right shape win on a key both sides declare", () => {
|
|
94
|
+
const out = Compile((doc) => doc.key("metadata").merge({ level: "nine" }));
|
|
95
|
+
(0, chai_1.expect)(out.type).to.deep.equal((0, types_1.JsonOf)({ level: types_1.TEXT, since: types_1.TIMESTAMP }));
|
|
96
|
+
});
|
|
97
|
+
it("falls to the bottom type when either shape is unknown", () => {
|
|
98
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("nope").merge({ level: 9 })).type).to.deep.equal(types_1.OPAQUE);
|
|
99
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("metadata").merge(doc.key("nope")))
|
|
100
|
+
.type).to.deep.equal(types_1.OPAQUE);
|
|
101
|
+
});
|
|
102
|
+
it("guards the merged result, since || wraps a non-object into an array", () => {
|
|
103
|
+
const out = Compile((doc) => doc.key("metadata").merge([1]));
|
|
104
|
+
const right = "($1::jsonb)";
|
|
105
|
+
(0, chai_1.expect)(out.sql).to.equal(Merged(METADATA, right, "t0"));
|
|
106
|
+
});
|
|
107
|
+
it("reads a scalar operand as jsonb rather than emitting a || postgresql rejects", () => {
|
|
108
|
+
const out = Compile((doc) => doc.key("name").merge({ level: 9 }));
|
|
109
|
+
const right = `jsonb_build_object('level', to_jsonb(${FLOAT_PARAM}))`;
|
|
110
|
+
(0, chai_1.expect)(out.sql).to.equal(Merged(`to_jsonb(${NAME})`, right, "t0"));
|
|
111
|
+
});
|
|
112
|
+
it("merges a bound row, which is the only form a join projection builds", () => {
|
|
113
|
+
const context = NewContext();
|
|
114
|
+
context.bind(OTHER_ROW_ID, new row_source_1.ColumnRowSource((0, row_source_1.AliasedColumns)("r"), users));
|
|
115
|
+
const out = (0, expression_1.CompileExpression)(interface_database_1.ValueProxy.arg(ROW_ID)
|
|
116
|
+
.merge({ customer: interface_database_1.ValueProxy.arg(OTHER_ROW_ID) })
|
|
117
|
+
.build(), context);
|
|
118
|
+
const left = new row_source_1.ColumnRowSource((0, row_source_1.AliasedColumns)("t"), users).toJson().sql;
|
|
119
|
+
const right = new row_source_1.ColumnRowSource((0, row_source_1.AliasedColumns)("r"), users).toJson().sql;
|
|
120
|
+
(0, chai_1.expect)(out.sql).to.equal(Merged(left, `jsonb_build_object('customer', ${right})`, "t0"));
|
|
121
|
+
(0, chai_1.expect)(out.type).to.deep.equal((0, types_1.JsonOf)({
|
|
122
|
+
...new row_source_1.ColumnRowSource((0, row_source_1.AliasedColumns)("t"), users).shape(),
|
|
123
|
+
customer: (0, types_1.JsonOf)(new row_source_1.ColumnRowSource((0, row_source_1.AliasedColumns)("r"), users).shape()),
|
|
124
|
+
}));
|
|
125
|
+
});
|
|
126
|
+
it("emits each operand once, so chained merges grow linearly", () => {
|
|
127
|
+
const context = NewContext();
|
|
128
|
+
context.bind(OTHER_ROW_ID, new row_source_1.ColumnRowSource((0, row_source_1.AliasedColumns)("r"), users));
|
|
129
|
+
const out = (0, expression_1.CompileExpression)(interface_database_1.ValueProxy.arg(ROW_ID)
|
|
130
|
+
.merge({ customer: interface_database_1.ValueProxy.arg(OTHER_ROW_ID) })
|
|
131
|
+
.merge({ level: 9 })
|
|
132
|
+
.build(), context);
|
|
133
|
+
(0, chai_1.expect)((0, spec_fixture_1.Occurrences)(out.sql, NAME)).to.equal(1);
|
|
134
|
+
(0, chai_1.expect)((0, spec_fixture_1.Occurrences)(out.sql, `"r"."name"`)).to.equal(1);
|
|
135
|
+
});
|
|
136
|
+
it("takes a fresh alias for every merge in one expression", () => {
|
|
137
|
+
const out = Compile((doc) => doc.key("metadata").merge({ level: 9 }).merge({ other: 1 }));
|
|
138
|
+
(0, chai_1.expect)(out.sql).to.contain(`AS "t0"`);
|
|
139
|
+
(0, chai_1.expect)(out.sql).to.contain(`AS "t1"`);
|
|
140
|
+
});
|
|
141
|
+
it("names the stage when the other object is absent", () => {
|
|
142
|
+
(0, chai_1.expect)(() => (0, expression_1.CompileExpression)([(0, common_1.QueryStage)("arg", undefined, ROW_ID), (0, common_1.QueryStage)("obj_merge")], NewContext())).to.throw(/'obj_merge'/);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe("obj_keys", () => {
|
|
146
|
+
it("aggregates the keys of a shaped column in jsonb's own stored order", () => {
|
|
147
|
+
const out = Compile((doc) => doc.key("metadata").keys());
|
|
148
|
+
(0, chai_1.expect)(out.sql).to.equal(Guarded(METADATA, Keys(METADATA, "t0")));
|
|
149
|
+
(0, chai_1.expect)(out.type).to.deep.equal((0, types_1.ArrayOf)(types_1.TEXT));
|
|
150
|
+
});
|
|
151
|
+
it("gives two walks in one expression different aliases", () => {
|
|
152
|
+
const out = Compile((doc) => doc.key("metadata").keys().eq(doc.key("metadata").keys()));
|
|
153
|
+
const aliases = [...out.sql.matchAll(/AS "(t\d+)"/g)].map((match) => match[1]);
|
|
154
|
+
(0, chai_1.expect)(aliases).to.deep.equal(["t0", "t1"]);
|
|
155
|
+
});
|
|
156
|
+
it("reads a scalar operand as jsonb, so the guard nulls it instead of failing", () => {
|
|
157
|
+
const left = `to_jsonb(${NAME})`;
|
|
158
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("name").keys()).sql).to.equal(Guarded(left, Keys(left, "t0")));
|
|
159
|
+
});
|
|
160
|
+
it("materializes a row before walking it", () => {
|
|
161
|
+
const out = (0, expression_1.CompileExpression)(interface_database_1.ValueProxy.arg(ROW_ID).keys().build(), NewContext());
|
|
162
|
+
(0, chai_1.expect)(out.sql).to.contain("jsonb_strip_nulls(jsonb_build_object('_id'");
|
|
163
|
+
(0, chai_1.expect)(out.sql).to.contain("jsonb_object_keys(");
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe("obj_values", () => {
|
|
167
|
+
it("aggregates the values in the same order as the keys", () => {
|
|
168
|
+
const out = Compile((doc) => doc.key("metadata").values());
|
|
169
|
+
(0, chai_1.expect)(out.sql).to.equal(Guarded(METADATA, Values(METADATA, "t0")));
|
|
170
|
+
});
|
|
171
|
+
it("keeps the element type at the bottom, since a shape is not exhaustive", () => {
|
|
172
|
+
(0, chai_1.expect)(Compile((doc) => doc.key("metadata").values()).type).to.deep.equal((0, types_1.ArrayOf)(types_1.OPAQUE));
|
|
173
|
+
});
|
|
174
|
+
it("never orders by the key, which would depend on the collation", () => {
|
|
175
|
+
const keys = Compile((doc) => doc.key("metadata").keys()).sql;
|
|
176
|
+
const values = Compile((doc) => doc.key("metadata").values()).sql;
|
|
177
|
+
(0, chai_1.expect)(keys).to.not.contain(`ORDER BY "t0"."key"`);
|
|
178
|
+
(0, chai_1.expect)(values).to.not.contain(`ORDER BY "t0"."key"`);
|
|
179
|
+
});
|
|
180
|
+
it("coalesces an empty object to an empty array rather than null", () => {
|
|
181
|
+
const empty = "jsonb_build_object()";
|
|
182
|
+
const out = (0, expression_1.CompileExpression)(interface_database_1.ValueProxy.constant({}).values().build(), NewContext());
|
|
183
|
+
(0, chai_1.expect)(out.sql).to.equal(Guarded(empty, Values(empty, "t0")));
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe("obj_has", () => {
|
|
187
|
+
it("builds a text array of literal keys, not a decoded parameter", () => {
|
|
188
|
+
const context = NewContext();
|
|
189
|
+
const out = (0, expression_1.CompileExpression)(interface_database_1.ValueProxy.arg(ROW_ID)
|
|
190
|
+
.key("metadata")
|
|
191
|
+
.hasfields("level", "since")
|
|
192
|
+
.build(), context);
|
|
193
|
+
(0, chai_1.expect)(out.sql).to.equal(HasFields(METADATA, `array['level', 'since']::text[]`));
|
|
194
|
+
(0, chai_1.expect)(out.type).to.equal(types_1.BOOL);
|
|
195
|
+
(0, chai_1.expect)(context.params.all()).to.deep.equal([]);
|
|
196
|
+
});
|
|
197
|
+
it("reads an empty field list as vacuously true, but only of an object", () => {
|
|
198
|
+
const out = Compile((doc) => doc.key("metadata").hasfields());
|
|
199
|
+
(0, chai_1.expect)(out.sql).to.equal(HasFields(METADATA, `array[]::text[]`));
|
|
200
|
+
});
|
|
201
|
+
it("escapes a quote in a field name", () => {
|
|
202
|
+
const out = Compile((doc) => doc.key("metadata").hasfields("o'clock"));
|
|
203
|
+
(0, chai_1.expect)(out.sql).to.equal(HasFields(METADATA, `array['o''clock']::text[]`));
|
|
204
|
+
});
|
|
205
|
+
it("tests an array as an object first, where ?& alone tests elements", () => {
|
|
206
|
+
const tags = `"t"."tags"`;
|
|
207
|
+
const out = Compile((doc) => doc.key("tags").hasfields("urgent"));
|
|
208
|
+
(0, chai_1.expect)(out.sql).to.equal(HasFields(tags, `array['urgent']::text[]`));
|
|
209
|
+
});
|
|
210
|
+
it("spells the object test as a conjunction, which a gin index sees through", () => {
|
|
211
|
+
const out = Compile((doc) => doc.key("metadata").hasfields("level"));
|
|
212
|
+
(0, chai_1.expect)(out.sql).to.not.contain("CASE");
|
|
213
|
+
(0, chai_1.expect)(out.sql).to.contain(`(${METADATA} @> '{}'::jsonb) AND `);
|
|
214
|
+
});
|
|
215
|
+
it("reads a scalar operand as jsonb, since ?& has no double precision form", () => {
|
|
216
|
+
const age = `to_jsonb("t"."age")`;
|
|
217
|
+
const out = Compile((doc) => doc.key("age").hasfields("a"));
|
|
218
|
+
(0, chai_1.expect)(out.sql).to.equal(HasFields(age, `array['a']::text[]`));
|
|
219
|
+
});
|
|
220
|
+
it("names the stage when the field list is not a list", () => {
|
|
221
|
+
(0, chai_1.expect)(() => (0, expression_1.CompileExpression)([(0, common_1.QueryStage)("arg", undefined, ROW_ID), (0, common_1.QueryStage)("obj_has")], NewContext())).to.throw(/'obj_has'/);
|
|
222
|
+
});
|
|
223
|
+
it("names the stage when a field name is not a string", () => {
|
|
224
|
+
(0, chai_1.expect)(() => (0, expression_1.CompileExpression)([
|
|
225
|
+
(0, common_1.QueryStage)("arg", undefined, ROW_ID),
|
|
226
|
+
(0, common_1.QueryStage)("obj_has", undefined, [5]),
|
|
227
|
+
], NewContext())).to.throw(/'obj_has'/);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=expression-object.spec.js.map
|