@milaboratories/pl-model-common 1.25.1 → 1.25.3
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/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/author_marker.d.ts +9 -6
- package/dist/base32_encode.cjs +40 -46
- package/dist/base32_encode.cjs.map +1 -1
- package/dist/base32_encode.js +40 -45
- package/dist/base32_encode.js.map +1 -1
- package/dist/base64.cjs +5 -4
- package/dist/base64.cjs.map +1 -1
- package/dist/base64.d.ts +10 -6
- package/dist/base64.js +5 -3
- package/dist/base64.js.map +1 -1
- package/dist/block_state.d.ts +21 -23
- package/dist/bmodel/block_config.cjs +9 -10
- package/dist/bmodel/block_config.cjs.map +1 -1
- package/dist/bmodel/block_config.d.ts +53 -72
- package/dist/bmodel/block_config.js +9 -9
- package/dist/bmodel/block_config.js.map +1 -1
- package/dist/bmodel/code.cjs +7 -6
- package/dist/bmodel/code.cjs.map +1 -1
- package/dist/bmodel/code.d.ts +17 -13
- package/dist/bmodel/code.js +6 -4
- package/dist/bmodel/code.js.map +1 -1
- package/dist/bmodel/container.d.ts +46 -44
- package/dist/bmodel/index.cjs +3 -0
- package/dist/bmodel/index.d.ts +5 -6
- package/dist/bmodel/index.js +3 -0
- package/dist/bmodel/normalization.cjs +90 -106
- package/dist/bmodel/normalization.cjs.map +1 -1
- package/dist/bmodel/normalization.d.ts +7 -3
- package/dist/bmodel/normalization.js +90 -105
- package/dist/bmodel/normalization.js.map +1 -1
- package/dist/bmodel/types.d.ts +4 -1
- package/dist/branding.d.ts +5 -5
- package/dist/common_types.d.ts +19 -15
- package/dist/driver_kit.d.ts +25 -17
- package/dist/drivers/ChunkedStreamReader.cjs +168 -203
- package/dist/drivers/ChunkedStreamReader.cjs.map +1 -1
- package/dist/drivers/ChunkedStreamReader.d.ts +104 -100
- package/dist/drivers/ChunkedStreamReader.js +168 -202
- package/dist/drivers/ChunkedStreamReader.js.map +1 -1
- package/dist/drivers/blob.cjs +15 -17
- package/dist/drivers/blob.cjs.map +1 -1
- package/dist/drivers/blob.d.ts +35 -35
- package/dist/drivers/blob.js +14 -15
- package/dist/drivers/blob.js.map +1 -1
- package/dist/drivers/index.cjs +18 -0
- package/dist/drivers/index.d.ts +29 -9
- package/dist/drivers/index.js +18 -0
- package/dist/drivers/interfaces.d.ts +17 -14
- package/dist/drivers/log.cjs +4 -3
- package/dist/drivers/log.cjs.map +1 -1
- package/dist/drivers/log.d.ts +52 -49
- package/dist/drivers/log.js +4 -2
- package/dist/drivers/log.js.map +1 -1
- package/dist/drivers/ls.cjs +16 -19
- package/dist/drivers/ls.cjs.map +1 -1
- package/dist/drivers/ls.d.ts +73 -76
- package/dist/drivers/ls.js +16 -17
- package/dist/drivers/ls.js.map +1 -1
- package/dist/drivers/pframe/column_filter.d.ts +19 -15
- package/dist/drivers/pframe/data_info.cjs +201 -252
- package/dist/drivers/pframe/data_info.cjs.map +1 -1
- package/dist/drivers/pframe/data_info.d.ts +84 -109
- package/dist/drivers/pframe/data_info.js +201 -250
- package/dist/drivers/pframe/data_info.js.map +1 -1
- package/dist/drivers/pframe/data_types.cjs +38 -63
- package/dist/drivers/pframe/data_types.cjs.map +1 -1
- package/dist/drivers/pframe/data_types.d.ts +91 -93
- package/dist/drivers/pframe/data_types.js +38 -61
- package/dist/drivers/pframe/data_types.js.map +1 -1
- package/dist/drivers/pframe/driver.cjs +7 -0
- package/dist/drivers/pframe/driver.cjs.map +1 -0
- package/dist/drivers/pframe/driver.d.ts +50 -45
- package/dist/drivers/pframe/driver.js +6 -0
- package/dist/drivers/pframe/driver.js.map +1 -0
- package/dist/drivers/pframe/filter_spec.d.ts +127 -123
- package/dist/drivers/pframe/find_columns.d.ts +21 -17
- package/dist/drivers/pframe/index.cjs +15 -0
- package/dist/drivers/pframe/index.d.ts +23 -16
- package/dist/drivers/pframe/index.js +15 -0
- package/dist/drivers/pframe/linker_columns.cjs +184 -238
- package/dist/drivers/pframe/linker_columns.cjs.map +1 -1
- package/dist/drivers/pframe/linker_columns.d.ts +45 -38
- package/dist/drivers/pframe/linker_columns.js +184 -236
- package/dist/drivers/pframe/linker_columns.js.map +1 -1
- package/dist/drivers/pframe/pframe.d.ts +26 -21
- package/dist/drivers/pframe/query/index.cjs +1 -0
- package/dist/drivers/pframe/query/index.d.ts +3 -4
- package/dist/drivers/pframe/query/index.js +1 -0
- package/dist/drivers/pframe/query/query_common.d.ts +205 -247
- package/dist/drivers/pframe/query/query_data.d.ts +25 -23
- package/dist/drivers/pframe/query/query_spec.d.ts +30 -29
- package/dist/drivers/pframe/query/utils.cjs +164 -183
- package/dist/drivers/pframe/query/utils.cjs.map +1 -1
- package/dist/drivers/pframe/query/utils.d.ts +13 -12
- package/dist/drivers/pframe/query/utils.js +164 -181
- package/dist/drivers/pframe/query/utils.js.map +1 -1
- package/dist/drivers/pframe/spec/anchored.cjs +178 -216
- package/dist/drivers/pframe/spec/anchored.cjs.map +1 -1
- package/dist/drivers/pframe/spec/anchored.d.ts +53 -49
- package/dist/drivers/pframe/spec/anchored.js +176 -214
- package/dist/drivers/pframe/spec/anchored.js.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.cjs +8 -7
- package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.d.ts +20 -17
- package/dist/drivers/pframe/spec/filtered_column.js +8 -6
- package/dist/drivers/pframe/spec/filtered_column.js.map +1 -1
- package/dist/drivers/pframe/spec/ids.cjs +16 -14
- package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
- package/dist/drivers/pframe/spec/ids.d.ts +13 -8
- package/dist/drivers/pframe/spec/ids.js +14 -12
- package/dist/drivers/pframe/spec/ids.js.map +1 -1
- package/dist/drivers/pframe/spec/index.cjs +6 -0
- package/dist/drivers/pframe/spec/index.d.ts +6 -7
- package/dist/drivers/pframe/spec/index.js +6 -0
- package/dist/drivers/pframe/spec/native_id.cjs +16 -16
- package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
- package/dist/drivers/pframe/spec/native_id.d.ts +9 -4
- package/dist/drivers/pframe/spec/native_id.js +13 -13
- package/dist/drivers/pframe/spec/native_id.js.map +1 -1
- package/dist/drivers/pframe/spec/selectors.cjs +72 -112
- package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
- package/dist/drivers/pframe/spec/selectors.d.ts +99 -94
- package/dist/drivers/pframe/spec/selectors.js +72 -110
- package/dist/drivers/pframe/spec/selectors.js.map +1 -1
- package/dist/drivers/pframe/spec/spec.cjs +282 -324
- package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
- package/dist/drivers/pframe/spec/spec.d.ts +263 -272
- package/dist/drivers/pframe/spec/spec.js +281 -322
- package/dist/drivers/pframe/spec/spec.js.map +1 -1
- package/dist/drivers/pframe/table.d.ts +28 -24
- package/dist/drivers/pframe/table_calculate.cjs +117 -147
- package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
- package/dist/drivers/pframe/table_calculate.d.ts +219 -220
- package/dist/drivers/pframe/table_calculate.js +117 -145
- package/dist/drivers/pframe/table_calculate.js.map +1 -1
- package/dist/drivers/pframe/table_common.cjs +13 -14
- package/dist/drivers/pframe/table_common.cjs.map +1 -1
- package/dist/drivers/pframe/table_common.d.ts +24 -19
- package/dist/drivers/pframe/table_common.js +13 -13
- package/dist/drivers/pframe/table_common.js.map +1 -1
- package/dist/drivers/pframe/unique_values.d.ts +23 -18
- package/dist/drivers/upload.d.ts +21 -18
- package/dist/drivers/urls.cjs +5 -6
- package/dist/drivers/urls.cjs.map +1 -1
- package/dist/drivers/urls.d.ts +12 -9
- package/dist/drivers/urls.js +5 -5
- package/dist/drivers/urls.js.map +1 -1
- package/dist/errors.cjs +65 -86
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +36 -33
- package/dist/errors.js +65 -85
- package/dist/errors.js.map +1 -1
- package/dist/flags/block_flags.cjs +7 -6
- package/dist/flags/block_flags.cjs.map +1 -1
- package/dist/flags/block_flags.d.ts +12 -8
- package/dist/flags/block_flags.js +7 -5
- package/dist/flags/block_flags.js.map +1 -1
- package/dist/flags/flag_utils.cjs +69 -108
- package/dist/flags/flag_utils.cjs.map +1 -1
- package/dist/flags/flag_utils.d.ts +40 -42
- package/dist/flags/flag_utils.js +70 -107
- package/dist/flags/flag_utils.js.map +1 -1
- package/dist/flags/type_utils.d.ts +12 -11
- package/dist/httpAuth.cjs +16 -20
- package/dist/httpAuth.cjs.map +1 -1
- package/dist/httpAuth.d.ts +10 -7
- package/dist/httpAuth.js +16 -19
- package/dist/httpAuth.js.map +1 -1
- package/dist/index.cjs +176 -179
- package/dist/index.d.ts +58 -20
- package/dist/index.js +37 -34
- package/dist/json.cjs +10 -8
- package/dist/json.cjs.map +1 -1
- package/dist/json.d.ts +18 -18
- package/dist/json.js +8 -6
- package/dist/json.js.map +1 -1
- package/dist/navigation.cjs +3 -2
- package/dist/navigation.cjs.map +1 -1
- package/dist/navigation.d.ts +18 -21
- package/dist/navigation.js +3 -1
- package/dist/navigation.js.map +1 -1
- package/dist/plid.cjs +16 -20
- package/dist/plid.cjs.map +1 -1
- package/dist/plid.d.ts +11 -7
- package/dist/plid.js +15 -18
- package/dist/plid.js.map +1 -1
- package/dist/pool/entry.d.ts +11 -11
- package/dist/pool/index.d.ts +3 -4
- package/dist/pool/query.cjs +21 -43
- package/dist/pool/query.cjs.map +1 -1
- package/dist/pool/query.d.ts +25 -20
- package/dist/pool/query.js +20 -40
- package/dist/pool/query.js.map +1 -1
- package/dist/pool/spec.cjs +40 -47
- package/dist/pool/spec.cjs.map +1 -1
- package/dist/pool/spec.d.ts +33 -31
- package/dist/pool/spec.js +40 -45
- package/dist/pool/spec.js.map +1 -1
- package/dist/ref.cjs +51 -71
- package/dist/ref.cjs.map +1 -1
- package/dist/ref.d.ts +36 -33
- package/dist/ref.js +50 -69
- package/dist/ref.js.map +1 -1
- package/dist/utag.d.ts +18 -14
- package/dist/util.cjs +8 -7
- package/dist/util.cjs.map +1 -1
- package/dist/util.d.ts +5 -2
- package/dist/util.js +8 -6
- package/dist/util.js.map +1 -1
- package/dist/value_or_error.cjs +7 -3
- package/dist/value_or_error.cjs.map +1 -1
- package/dist/value_or_error.d.ts +9 -6
- package/dist/value_or_error.js +7 -2
- package/dist/value_or_error.js.map +1 -1
- package/package.json +6 -6
- package/src/flags/block_flags.ts +2 -1
- package/src/flags/flag_utils.ts +0 -22
- package/dist/author_marker.d.ts.map +0 -1
- package/dist/base32_encode.d.ts +0 -8
- package/dist/base32_encode.d.ts.map +0 -1
- package/dist/base64.d.ts.map +0 -1
- package/dist/block_state.d.ts.map +0 -1
- package/dist/bmodel/block_config.d.ts.map +0 -1
- package/dist/bmodel/code.d.ts.map +0 -1
- package/dist/bmodel/container.d.ts.map +0 -1
- package/dist/bmodel/index.d.ts.map +0 -1
- package/dist/bmodel/normalization.d.ts.map +0 -1
- package/dist/bmodel/types.d.ts.map +0 -1
- package/dist/branding.d.ts.map +0 -1
- package/dist/common_types.d.ts.map +0 -1
- package/dist/driver_kit.d.ts.map +0 -1
- package/dist/drivers/ChunkedStreamReader.d.ts.map +0 -1
- package/dist/drivers/blob.d.ts.map +0 -1
- package/dist/drivers/index.d.ts.map +0 -1
- package/dist/drivers/interfaces.d.ts.map +0 -1
- package/dist/drivers/log.d.ts.map +0 -1
- package/dist/drivers/ls.d.ts.map +0 -1
- package/dist/drivers/pframe/column_filter.d.ts.map +0 -1
- package/dist/drivers/pframe/data_info.d.ts.map +0 -1
- package/dist/drivers/pframe/data_types.d.ts.map +0 -1
- package/dist/drivers/pframe/driver.d.ts.map +0 -1
- package/dist/drivers/pframe/filter_spec.d.ts.map +0 -1
- package/dist/drivers/pframe/find_columns.d.ts.map +0 -1
- package/dist/drivers/pframe/index.d.ts.map +0 -1
- package/dist/drivers/pframe/linker_columns.d.ts.map +0 -1
- package/dist/drivers/pframe/pframe.d.ts.map +0 -1
- package/dist/drivers/pframe/query/index.d.ts.map +0 -1
- package/dist/drivers/pframe/query/query_common.d.ts.map +0 -1
- package/dist/drivers/pframe/query/query_data.d.ts.map +0 -1
- package/dist/drivers/pframe/query/query_spec.d.ts.map +0 -1
- package/dist/drivers/pframe/query/utils.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/anchored.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/filtered_column.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/ids.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/index.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/native_id.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/selectors.d.ts.map +0 -1
- package/dist/drivers/pframe/spec/spec.d.ts.map +0 -1
- package/dist/drivers/pframe/table.d.ts.map +0 -1
- package/dist/drivers/pframe/table_calculate.d.ts.map +0 -1
- package/dist/drivers/pframe/table_common.d.ts.map +0 -1
- package/dist/drivers/pframe/type_util.d.ts +0 -5
- package/dist/drivers/pframe/type_util.d.ts.map +0 -1
- package/dist/drivers/pframe/unique_values.d.ts.map +0 -1
- package/dist/drivers/upload.d.ts.map +0 -1
- package/dist/drivers/urls.d.ts.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/flags/block_flags.d.ts.map +0 -1
- package/dist/flags/flag_utils.d.ts.map +0 -1
- package/dist/flags/index.d.ts +0 -4
- package/dist/flags/index.d.ts.map +0 -1
- package/dist/flags/type_utils.d.ts.map +0 -1
- package/dist/httpAuth.d.ts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/json.d.ts.map +0 -1
- package/dist/navigation.d.ts.map +0 -1
- package/dist/plid.d.ts.map +0 -1
- package/dist/pool/entry.d.ts.map +0 -1
- package/dist/pool/index.d.ts.map +0 -1
- package/dist/pool/query.d.ts.map +0 -1
- package/dist/pool/spec.d.ts.map +0 -1
- package/dist/ref.d.ts.map +0 -1
- package/dist/utag.d.ts.map +0 -1
- package/dist/util.d.ts.map +0 -1
- package/dist/value_or_error.d.ts.map +0 -1
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { PObjectId } from "../../../pool/spec.js";
|
|
2
|
+
import "../../../pool/index.js";
|
|
3
|
+
import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, TypeSpec } from "./query_common.js";
|
|
4
|
+
|
|
5
|
+
//#region src/drivers/pframe/query/query_data.d.ts
|
|
3
6
|
/**
|
|
4
7
|
* Column identifier with type specification.
|
|
5
8
|
*
|
|
@@ -7,10 +10,8 @@ import type { ExprAxisRef, ExprColumnRef, ExprNumericBinary, ExprNumericComparis
|
|
|
7
10
|
* Used in data layer to carry type information alongside column references.
|
|
8
11
|
*/
|
|
9
12
|
type ColumnIdAndTypeSpec = {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
/** Type specification defining axes and column types */
|
|
13
|
-
typeSpec: TypeSpec;
|
|
13
|
+
/** Unique identifier of the column */id: PObjectId; /** Type specification defining axes and column types */
|
|
14
|
+
typeSpec: TypeSpec;
|
|
14
15
|
};
|
|
15
16
|
/**
|
|
16
17
|
* Join entry for data layer queries.
|
|
@@ -24,26 +25,26 @@ type ColumnIdAndTypeSpec = {
|
|
|
24
25
|
* // - This entry's axis 1 maps to result axis 2
|
|
25
26
|
* { entry: queryData, axesMapping: [0, 2] }
|
|
26
27
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
interface DataQueryJoinEntry extends QueryJoinEntry<DataQuery> {
|
|
29
|
+
/** Maps this entry's axes to the result axes by index */
|
|
30
|
+
axesMapping: number[];
|
|
30
31
|
}
|
|
31
32
|
/** @see QueryColumn */
|
|
32
|
-
|
|
33
|
+
type DataQueryColumn = QueryColumn;
|
|
33
34
|
/** @see QueryInlineColumn */
|
|
34
|
-
|
|
35
|
+
type DataQueryInlineColumn = QueryInlineColumn<ColumnIdAndTypeSpec>;
|
|
35
36
|
/** @see QuerySparseToDenseColumn */
|
|
36
|
-
|
|
37
|
+
type DataQuerySparseToDenseColumn = QuerySparseToDenseColumn<PObjectId, ColumnIdAndTypeSpec>;
|
|
37
38
|
/** @see QuerySymmetricJoin */
|
|
38
|
-
|
|
39
|
+
type DataQuerySymmetricJoin = QuerySymmetricJoin<DataQueryJoinEntry>;
|
|
39
40
|
/** @see QueryOuterJoin */
|
|
40
|
-
|
|
41
|
+
type DataQueryOuterJoin = QueryOuterJoin<DataQueryJoinEntry>;
|
|
41
42
|
/** @see QuerySliceAxes */
|
|
42
|
-
|
|
43
|
+
type DataQuerySliceAxes = QuerySliceAxes<DataQuery, QueryAxisSelector<number>>;
|
|
43
44
|
/** @see QuerySort */
|
|
44
|
-
|
|
45
|
+
type DataQuerySort = QuerySort<DataQuery, DataQueryExpression>;
|
|
45
46
|
/** @see QueryFilter */
|
|
46
|
-
|
|
47
|
+
type DataQueryFilter = QueryFilter<DataQuery, DataQueryBooleanExpression>;
|
|
47
48
|
/**
|
|
48
49
|
* Union of all data layer query types.
|
|
49
50
|
*
|
|
@@ -55,12 +56,13 @@ export type DataQueryFilter = QueryFilter<DataQuery, DataQueryBooleanExpression>
|
|
|
55
56
|
* - Join operations: innerJoin, fullJoin, outerJoin
|
|
56
57
|
* - Transformations: sliceAxes, sort, filter
|
|
57
58
|
*/
|
|
58
|
-
|
|
59
|
+
type DataQuery = DataQueryColumn | DataQueryInlineColumn | DataQuerySparseToDenseColumn | DataQuerySymmetricJoin | DataQueryOuterJoin | DataQuerySliceAxes | DataQuerySort | DataQueryFilter;
|
|
59
60
|
/** @see ExprAxisRef */
|
|
60
|
-
|
|
61
|
+
type DataExprAxisRef = ExprAxisRef<number>;
|
|
61
62
|
/** @see ExprColumnRef */
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
type DataExprColumnRef = ExprColumnRef<number>;
|
|
64
|
+
type DataQueryExpression = DataExprColumnRef | DataExprAxisRef | ExprConstant | ExprNumericBinary<DataQueryExpression> | ExprNumericComparison<DataQueryExpression> | ExprNumericUnary<DataQueryExpression> | ExprStringEquals<DataQueryExpression> | ExprStringContains<DataQueryExpression> | ExprStringRegex<DataQueryExpression> | ExprStringContainsFuzzy<DataQueryExpression> | ExprIsNull<DataQueryExpression> | ExprIfNull<DataQueryExpression> | ExprLogicalUnary<DataQueryExpression> | ExprLogicalVariadic<DataQueryExpression> | ExprIsIn<DataQueryExpression, string> | ExprIsIn<DataQueryExpression, number>;
|
|
65
|
+
type DataQueryBooleanExpression = InferBooleanExpressionUnion<DataQueryExpression>;
|
|
66
|
+
//#endregion
|
|
67
|
+
export { DataExprAxisRef, DataExprColumnRef, DataQuery, DataQueryBooleanExpression, DataQueryColumn, DataQueryExpression, DataQueryFilter, DataQueryInlineColumn, DataQueryJoinEntry, DataQueryOuterJoin, DataQuerySliceAxes, DataQuerySort, DataQuerySparseToDenseColumn, DataQuerySymmetricJoin };
|
|
66
68
|
//# sourceMappingURL=query_data.d.ts.map
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { PObjectId } from "../../../pool/spec.js";
|
|
2
|
+
import "../../../pool/index.js";
|
|
3
|
+
import { Domain, PColumnIdAndSpec, PColumnSpec } from "../spec/spec.js";
|
|
4
|
+
import { SingleAxisSelector } from "../spec/selectors.js";
|
|
5
|
+
import "../spec/index.js";
|
|
6
|
+
import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin } from "./query_common.js";
|
|
7
|
+
|
|
8
|
+
//#region src/drivers/pframe/query/query_spec.d.ts
|
|
4
9
|
/**
|
|
5
10
|
* Column identifier with specification.
|
|
6
11
|
*
|
|
@@ -8,10 +13,8 @@ import type { Domain, PColumnIdAndSpec, PColumnSpec, SingleAxisSelector } from "
|
|
|
8
13
|
* Used in spec layer to carry column specification alongside references.
|
|
9
14
|
*/
|
|
10
15
|
type ColumnIdAndSpec = {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/** Full column specification including axes and value type */
|
|
14
|
-
spec: PColumnSpec;
|
|
16
|
+
/** Unique identifier of the column */id: PObjectId; /** Full column specification including axes and value type */
|
|
17
|
+
spec: PColumnSpec;
|
|
15
18
|
};
|
|
16
19
|
/**
|
|
17
20
|
* Join entry for spec layer queries.
|
|
@@ -29,31 +32,28 @@ type ColumnIdAndSpec = {
|
|
|
29
32
|
* ]
|
|
30
33
|
* }
|
|
31
34
|
*/
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
/** Additional domain constraints for this axis */
|
|
38
|
-
additionalDomains: Domain;
|
|
39
|
-
}[];
|
|
35
|
+
type SpecQueryJoinEntry<C = PObjectId> = QueryJoinEntry<SpecQuery<C>> & {
|
|
36
|
+
/** Axis qualifications with additional domain constraints */qualifications: {
|
|
37
|
+
/** Axis selector identifying which axis to qualify */axis: SingleAxisSelector; /** Additional domain constraints for this axis */
|
|
38
|
+
additionalDomains: Domain;
|
|
39
|
+
}[];
|
|
40
40
|
};
|
|
41
41
|
/** @see QueryColumn */
|
|
42
|
-
|
|
42
|
+
type SpecQueryColumn<C = PObjectId> = QueryColumn<C>;
|
|
43
43
|
/** @see QueryInlineColumn */
|
|
44
|
-
|
|
44
|
+
type SpecQueryInlineColumn = QueryInlineColumn<ColumnIdAndSpec>;
|
|
45
45
|
/** @see QuerySparseToDenseColumn */
|
|
46
|
-
|
|
46
|
+
type SpecQuerySparseToDenseColumn<C = PObjectId> = QuerySparseToDenseColumn<C, PColumnIdAndSpec>;
|
|
47
47
|
/** @see QuerySymmetricJoin */
|
|
48
|
-
|
|
48
|
+
type SpecQuerySymmetricJoin<C = PObjectId> = QuerySymmetricJoin<SpecQueryJoinEntry<C>>;
|
|
49
49
|
/** @see QueryOuterJoin */
|
|
50
|
-
|
|
50
|
+
type SpecQueryOuterJoin<C = PObjectId> = QueryOuterJoin<SpecQueryJoinEntry<C>>;
|
|
51
51
|
/** @see QuerySliceAxes */
|
|
52
|
-
|
|
52
|
+
type SpecQuerySliceAxes<C = PObjectId> = QuerySliceAxes<SpecQuery<C>, QueryAxisSelector<SingleAxisSelector>>;
|
|
53
53
|
/** @see QuerySort */
|
|
54
|
-
|
|
54
|
+
type SpecQuerySort<C = PObjectId> = QuerySort<SpecQuery<C>, SpecQueryExpression>;
|
|
55
55
|
/** @see QueryFilter */
|
|
56
|
-
|
|
56
|
+
type SpecQueryFilter<C = PObjectId> = QueryFilter<SpecQuery<C>, SpecQueryBooleanExpression>;
|
|
57
57
|
/**
|
|
58
58
|
* Union of all spec layer query types.
|
|
59
59
|
*
|
|
@@ -69,12 +69,13 @@ export type SpecQueryFilter<C = PObjectId> = QueryFilter<SpecQuery<C>, SpecQuery
|
|
|
69
69
|
* - Join operations: innerJoin, fullJoin, outerJoin
|
|
70
70
|
* - Transformations: sliceAxes, sort, filter
|
|
71
71
|
*/
|
|
72
|
-
|
|
72
|
+
type SpecQuery<C = PObjectId> = SpecQueryColumn<C> | SpecQueryInlineColumn | SpecQuerySparseToDenseColumn<C> | SpecQuerySymmetricJoin<C> | SpecQueryOuterJoin<C> | SpecQuerySliceAxes<C> | SpecQuerySort<C> | SpecQueryFilter<C>;
|
|
73
73
|
/** @see ExprAxisRef */
|
|
74
|
-
|
|
74
|
+
type SpecExprAxisRef = ExprAxisRef<SingleAxisSelector>;
|
|
75
75
|
/** @see ExprColumnRef */
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
type SpecExprColumnRef = ExprColumnRef<PObjectId>;
|
|
77
|
+
type SpecQueryExpression = SpecExprColumnRef | SpecExprAxisRef | ExprConstant | ExprNumericBinary<SpecQueryExpression> | ExprNumericComparison<SpecQueryExpression> | ExprNumericUnary<SpecQueryExpression> | ExprStringEquals<SpecQueryExpression> | ExprStringContains<SpecQueryExpression> | ExprStringRegex<SpecQueryExpression> | ExprStringContainsFuzzy<SpecQueryExpression> | ExprIsNull<SpecQueryExpression> | ExprIfNull<SpecQueryExpression> | ExprLogicalUnary<SpecQueryExpression> | ExprLogicalVariadic<SpecQueryExpression> | ExprIsIn<SpecQueryExpression, string> | ExprIsIn<SpecQueryExpression, number>;
|
|
78
|
+
type SpecQueryBooleanExpression = InferBooleanExpressionUnion<SpecQueryExpression>;
|
|
79
|
+
//#endregion
|
|
80
|
+
export { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin };
|
|
80
81
|
//# sourceMappingURL=query_spec.d.ts.map
|
|
@@ -1,209 +1,190 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var json = require('../../../json.cjs');
|
|
4
|
-
var util = require('../../../util.cjs');
|
|
1
|
+
const require_util = require('../../../util.cjs');
|
|
2
|
+
const require_json = require('../../../json.cjs');
|
|
5
3
|
|
|
4
|
+
//#region src/drivers/pframe/query/utils.ts
|
|
6
5
|
const booleanTypesSet = new Set([
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
6
|
+
"numericComparison",
|
|
7
|
+
"stringEquals",
|
|
8
|
+
"stringContains",
|
|
9
|
+
"stringContainsFuzzy",
|
|
10
|
+
"stringRegex",
|
|
11
|
+
"isNull",
|
|
12
|
+
"not",
|
|
13
|
+
"and",
|
|
14
|
+
"or",
|
|
15
|
+
"isIn"
|
|
17
16
|
]);
|
|
18
17
|
function isBooleanExpression(expr) {
|
|
19
|
-
|
|
20
|
-
// @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime
|
|
21
|
-
expr.type);
|
|
18
|
+
return booleanTypesSet.has(expr.type);
|
|
22
19
|
}
|
|
23
20
|
/**
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
21
|
+
* Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.
|
|
22
|
+
*
|
|
23
|
+
* Traversal order:
|
|
24
|
+
* 1. Recurse into child queries
|
|
25
|
+
* 2. Apply `column` to transform column references in leaf nodes
|
|
26
|
+
* 3. Apply `joinEntry` to each join entry (with inner query already traversed)
|
|
27
|
+
* 4. Assemble node with transformed children
|
|
28
|
+
* 5. Apply `node` to the assembled node
|
|
29
|
+
*/
|
|
33
30
|
function traverseQuerySpec(query, visitor) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
31
|
+
const traverseEntry = (entry) => {
|
|
32
|
+
const traversed = {
|
|
33
|
+
...entry,
|
|
34
|
+
entry: traverseQuerySpec(entry.entry, visitor)
|
|
35
|
+
};
|
|
36
|
+
return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;
|
|
37
|
+
};
|
|
38
|
+
let result;
|
|
39
|
+
switch (query.type) {
|
|
40
|
+
case "column":
|
|
41
|
+
result = {
|
|
42
|
+
type: "column",
|
|
43
|
+
column: visitor.column(query.column)
|
|
44
|
+
};
|
|
45
|
+
break;
|
|
46
|
+
case "sparseToDenseColumn":
|
|
47
|
+
result = {
|
|
48
|
+
...query,
|
|
49
|
+
column: visitor.column(query.column)
|
|
50
|
+
};
|
|
51
|
+
break;
|
|
52
|
+
case "inlineColumn":
|
|
53
|
+
result = query;
|
|
54
|
+
break;
|
|
55
|
+
case "innerJoin":
|
|
56
|
+
case "fullJoin":
|
|
57
|
+
result = {
|
|
58
|
+
...query,
|
|
59
|
+
entries: query.entries.map(traverseEntry)
|
|
60
|
+
};
|
|
61
|
+
break;
|
|
62
|
+
case "outerJoin":
|
|
63
|
+
result = {
|
|
64
|
+
...query,
|
|
65
|
+
primary: traverseEntry(query.primary),
|
|
66
|
+
secondary: query.secondary.map(traverseEntry)
|
|
67
|
+
};
|
|
68
|
+
break;
|
|
69
|
+
case "filter":
|
|
70
|
+
case "sort":
|
|
71
|
+
case "sliceAxes":
|
|
72
|
+
result = {
|
|
73
|
+
...query,
|
|
74
|
+
input: traverseQuerySpec(query.input, visitor)
|
|
75
|
+
};
|
|
76
|
+
break;
|
|
77
|
+
default: require_util.assertNever(query);
|
|
78
|
+
}
|
|
79
|
+
return visitor.node ? visitor.node(result) : result;
|
|
72
80
|
}
|
|
73
81
|
/** Recursively maps all column references in a SpecQuery tree. */
|
|
74
82
|
function mapSpecQueryColumns(query, cb) {
|
|
75
|
-
|
|
83
|
+
return traverseQuerySpec(query, { column: cb });
|
|
76
84
|
}
|
|
77
85
|
/** Collects all column references from a SpecQuery tree. */
|
|
78
86
|
function collectSpecQueryColumns(query) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
});
|
|
86
|
-
return result;
|
|
87
|
+
const result = [];
|
|
88
|
+
traverseQuerySpec(query, { column: (c) => {
|
|
89
|
+
result.push(c);
|
|
90
|
+
return c;
|
|
91
|
+
} });
|
|
92
|
+
return result;
|
|
87
93
|
}
|
|
88
94
|
function sortSpecQuery(query) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
95
|
+
return traverseQuerySpec(query, {
|
|
96
|
+
column: (c) => c,
|
|
97
|
+
node: (node) => {
|
|
98
|
+
switch (node.type) {
|
|
99
|
+
case "sparseToDenseColumn": return {
|
|
100
|
+
...node,
|
|
101
|
+
axesIndices: node.axesIndices.toSorted((a, b) => a - b)
|
|
102
|
+
};
|
|
103
|
+
case "innerJoin":
|
|
104
|
+
case "fullJoin": {
|
|
105
|
+
const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);
|
|
106
|
+
return {
|
|
107
|
+
...node,
|
|
108
|
+
entries: sorted
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
case "outerJoin": {
|
|
112
|
+
const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);
|
|
113
|
+
return {
|
|
114
|
+
...node,
|
|
115
|
+
secondary: sorted
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
case "sliceAxes": return {
|
|
119
|
+
...node,
|
|
120
|
+
axisFilters: node.axisFilters.toSorted((a, b) => {
|
|
121
|
+
const ak = require_json.canonicalizeJson(a.axisSelector);
|
|
122
|
+
const bk = require_json.canonicalizeJson(b.axisSelector);
|
|
123
|
+
return ak < bk ? -1 : ak === bk ? 0 : 1;
|
|
124
|
+
})
|
|
125
|
+
};
|
|
126
|
+
default: return node;
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
joinEntry: (entry) => ({
|
|
130
|
+
...entry,
|
|
131
|
+
qualifications: entry.qualifications.toSorted((a, b) => {
|
|
132
|
+
const ak = require_json.canonicalizeJson(a.axis);
|
|
133
|
+
const bk = require_json.canonicalizeJson(b.axis);
|
|
134
|
+
return ak < bk ? -1 : ak === bk ? 0 : 1;
|
|
135
|
+
})
|
|
136
|
+
})
|
|
137
|
+
});
|
|
126
138
|
}
|
|
127
139
|
function cmpQuerySpec(lhs, rhs) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
return cmp;
|
|
160
|
-
}
|
|
161
|
-
return 0;
|
|
162
|
-
}
|
|
163
|
-
case "outerJoin": {
|
|
164
|
-
const rhsOuter = rhs;
|
|
165
|
-
const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);
|
|
166
|
-
if (cmp !== 0)
|
|
167
|
-
return cmp;
|
|
168
|
-
if (lhs.secondary.length !== rhsOuter.secondary.length) {
|
|
169
|
-
return lhs.secondary.length - rhsOuter.secondary.length;
|
|
170
|
-
}
|
|
171
|
-
for (let i = 0; i < lhs.secondary.length; i++) {
|
|
172
|
-
const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);
|
|
173
|
-
if (cmp !== 0)
|
|
174
|
-
return cmp;
|
|
175
|
-
}
|
|
176
|
-
return 0;
|
|
177
|
-
}
|
|
178
|
-
case "sliceAxes":
|
|
179
|
-
return cmpQuerySpec(lhs.input, rhs.input);
|
|
180
|
-
case "sort":
|
|
181
|
-
return cmpQuerySpec(lhs.input, rhs.input);
|
|
182
|
-
case "filter":
|
|
183
|
-
return cmpQuerySpec(lhs.input, rhs.input);
|
|
184
|
-
default:
|
|
185
|
-
util.assertNever(lhs);
|
|
186
|
-
}
|
|
140
|
+
if (lhs.type !== rhs.type) return lhs.type < rhs.type ? -1 : 1;
|
|
141
|
+
switch (lhs.type) {
|
|
142
|
+
case "column": return lhs.column < rhs.column ? -1 : lhs.column === rhs.column ? 0 : 1;
|
|
143
|
+
case "inlineColumn": return lhs.spec.id < rhs.spec.id ? -1 : lhs.spec.id === rhs.spec.id ? 0 : 1;
|
|
144
|
+
case "sparseToDenseColumn": return lhs.column < rhs.column ? -1 : lhs.column === rhs.column ? 0 : 1;
|
|
145
|
+
case "innerJoin":
|
|
146
|
+
case "fullJoin": {
|
|
147
|
+
const rhsJoin = rhs;
|
|
148
|
+
if (lhs.entries.length !== rhsJoin.entries.length) return lhs.entries.length - rhsJoin.entries.length;
|
|
149
|
+
for (let i = 0; i < lhs.entries.length; i++) {
|
|
150
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);
|
|
151
|
+
if (cmp !== 0) return cmp;
|
|
152
|
+
}
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
case "outerJoin": {
|
|
156
|
+
const rhsOuter = rhs;
|
|
157
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);
|
|
158
|
+
if (cmp !== 0) return cmp;
|
|
159
|
+
if (lhs.secondary.length !== rhsOuter.secondary.length) return lhs.secondary.length - rhsOuter.secondary.length;
|
|
160
|
+
for (let i = 0; i < lhs.secondary.length; i++) {
|
|
161
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);
|
|
162
|
+
if (cmp !== 0) return cmp;
|
|
163
|
+
}
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
case "sliceAxes": return cmpQuerySpec(lhs.input, rhs.input);
|
|
167
|
+
case "sort": return cmpQuerySpec(lhs.input, rhs.input);
|
|
168
|
+
case "filter": return cmpQuerySpec(lhs.input, rhs.input);
|
|
169
|
+
default: require_util.assertNever(lhs);
|
|
170
|
+
}
|
|
187
171
|
}
|
|
188
172
|
function cmpQueryJoinEntrySpec(lhs, rhs) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
if (lhsQ !== rhsQ)
|
|
199
|
-
return lhsQ < rhsQ ? -1 : 1;
|
|
200
|
-
}
|
|
201
|
-
return 0;
|
|
173
|
+
const cmp = cmpQuerySpec(lhs.entry, rhs.entry);
|
|
174
|
+
if (cmp !== 0) return cmp;
|
|
175
|
+
if (lhs.qualifications.length !== rhs.qualifications.length) return lhs.qualifications.length - rhs.qualifications.length;
|
|
176
|
+
for (let i = 0; i < lhs.qualifications.length; i++) {
|
|
177
|
+
const lhsQ = require_json.canonicalizeJson(lhs.qualifications[i]);
|
|
178
|
+
const rhsQ = require_json.canonicalizeJson(rhs.qualifications[i]);
|
|
179
|
+
if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;
|
|
180
|
+
}
|
|
181
|
+
return 0;
|
|
202
182
|
}
|
|
203
183
|
|
|
184
|
+
//#endregion
|
|
204
185
|
exports.collectSpecQueryColumns = collectSpecQueryColumns;
|
|
205
186
|
exports.isBooleanExpression = isBooleanExpression;
|
|
206
187
|
exports.mapSpecQueryColumns = mapSpecQueryColumns;
|
|
207
188
|
exports.sortSpecQuery = sortSpecQuery;
|
|
208
189
|
exports.traverseQuerySpec = traverseQuerySpec;
|
|
209
|
-
//# sourceMappingURL=utils.cjs.map
|
|
190
|
+
//# sourceMappingURL=utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.cjs","sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"names":["assertNever","canonicalizeJson"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.cjs","names":["canonicalizeJson"],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":";;;;AASA,MAAM,kBAAkB,IAAI,IAAwC;CAClE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,oBAAoB,MAA+D;AACjG,QAAO,gBAAgB,IAErB,KAAK,KACN;;;;;;;;;;;;AAaH,SAAgB,kBACd,OACA,SAQe;CACf,MAAM,iBAAiB,UAA0D;EAC/E,MAAM,YAAoC;GACxC,GAAG;GACH,OAAO,kBAAkB,MAAM,OAAO,QAAQ;GAC/C;AACD,SAAO,QAAQ,YAAY,QAAQ,UAAU,UAAU,GAAG;;CAG5D,IAAI;AACJ,SAAQ,MAAM,MAAd;EACE,KAAK;AACH,YAAS;IAAE,MAAM;IAAU,QAAQ,QAAQ,OAAO,MAAM,OAAO;IAAE;AACjE;EACF,KAAK;AACH,YAAS;IAAE,GAAG;IAAO,QAAQ,QAAQ,OAAO,MAAM,OAAO;IAAE;AAC3D;EACF,KAAK;AACH,YAAS;AACT;EACF,KAAK;EACL,KAAK;AACH,YAAS;IAAE,GAAG;IAAO,SAAS,MAAM,QAAQ,IAAI,cAAc;IAAE;AAChE;EACF,KAAK;AACH,YAAS;IACP,GAAG;IACH,SAAS,cAAc,MAAM,QAAQ;IACrC,WAAW,MAAM,UAAU,IAAI,cAAc;IAC9C;AACD;EACF,KAAK;EACL,KAAK;EACL,KAAK;AACH,YAAS;IAAE,GAAG;IAAO,OAAO,kBAAkB,MAAM,OAAO,QAAQ;IAAE;AACrE;EACF,QACE,0BAAY,MAAM;;AAGtB,QAAO,QAAQ,OAAO,QAAQ,KAAK,OAAO,GAAG;;;AAI/C,SAAgB,oBACd,OACA,IACe;AACf,QAAO,kBAAkB,OAAO,EAAE,QAAQ,IAAI,CAAC;;;AAIjD,SAAgB,wBAA2B,OAA0B;CACnE,MAAM,SAAc,EAAE;AACtB,mBAAkB,OAAO,EACvB,SAAS,MAAS;AAChB,SAAO,KAAK,EAAE;AACd,SAAO;IAEV,CAAC;AACF,QAAO;;AAGT,SAAgB,cAAc,OAA6B;AACzD,QAAO,kBAAkB,OAAO;EAC9B,SAAS,MAAM;EACf,OAAO,SAAS;AACd,WAAQ,KAAK,MAAb;IACE,KAAK,sBACH,QAAO;KAAE,GAAG;KAAM,aAAa,KAAK,YAAY,UAAU,GAAG,MAAM,IAAI,EAAE;KAAE;IAC7E,KAAK;IACL,KAAK,YAAY;KACf,MAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK,sBAAsB;AAC5D,YAAO;MAAE,GAAG;MAAM,SAAS;MAAQ;;IAErC,KAAK,aAAa;KAChB,MAAM,SAAS,CAAC,GAAG,KAAK,UAAU,CAAC,KAAK,sBAAsB;AAC9D,YAAO;MAAE,GAAG;MAAM,WAAW;MAAQ;;IAEvC,KAAK,YACH,QAAO;KACL,GAAG;KACH,aAAa,KAAK,YAAY,UAAU,GAAG,MAAM;MAC/C,MAAM,KAAKA,8BAAiB,EAAE,aAAa;MAC3C,MAAM,KAAKA,8BAAiB,EAAE,aAAa;AAC3C,aAAO,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI;OACtC;KACH;IACH,QACE,QAAO;;;EAGb,YAAY,WAAW;GACrB,GAAG;GACH,gBAAgB,MAAM,eAAe,UAAU,GAAG,MAAM;IACtD,MAAM,KAAKA,8BAAiB,EAAE,KAAK;IACnC,MAAM,KAAKA,8BAAiB,EAAE,KAAK;AACnC,WAAO,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI;KACtC;GACH;EACF,CAAC;;AAGJ,SAAS,aAAa,KAAgB,KAAwB;AAC5D,KAAI,IAAI,SAAS,IAAI,KACnB,QAAO,IAAI,OAAO,IAAI,OAAO,KAAK;AAEpC,SAAQ,IAAI,MAAZ;EACE,KAAK,SACH,QAAO,IAAI,SAAU,IAAmB,SACpC,KACA,IAAI,WAAY,IAAmB,SACjC,IACA;EACR,KAAK,eACH,QAAO,IAAI,KAAK,KAAM,IAAmB,KAAK,KAC1C,KACA,IAAI,KAAK,OAAQ,IAAmB,KAAK,KACvC,IACA;EACR,KAAK,sBACH,QAAO,IAAI,SAAU,IAAmB,SACpC,KACA,IAAI,WAAY,IAAmB,SACjC,IACA;EACR,KAAK;EACL,KAAK,YAAY;GACf,MAAM,UAAU;AAChB,OAAI,IAAI,QAAQ,WAAW,QAAQ,QAAQ,OACzC,QAAO,IAAI,QAAQ,SAAS,QAAQ,QAAQ;AAE9C,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,QAAQ,KAAK;IAC3C,MAAM,MAAM,sBAAsB,IAAI,QAAQ,IAAI,QAAQ,QAAQ,GAAG;AACrE,QAAI,QAAQ,EAAG,QAAO;;AAExB,UAAO;;EAET,KAAK,aAAa;GAChB,MAAM,WAAW;GACjB,MAAM,MAAM,sBAAsB,IAAI,SAAS,SAAS,QAAQ;AAChE,OAAI,QAAQ,EAAG,QAAO;AACtB,OAAI,IAAI,UAAU,WAAW,SAAS,UAAU,OAC9C,QAAO,IAAI,UAAU,SAAS,SAAS,UAAU;AAEnD,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,UAAU,QAAQ,KAAK;IAC7C,MAAM,MAAM,sBAAsB,IAAI,UAAU,IAAI,SAAS,UAAU,GAAG;AAC1E,QAAI,QAAQ,EAAG,QAAO;;AAExB,UAAO;;EAET,KAAK,YACH,QAAO,aAAa,IAAI,OAAQ,IAAmB,MAAM;EAC3D,KAAK,OACH,QAAO,aAAa,IAAI,OAAQ,IAAmB,MAAM;EAC3D,KAAK,SACH,QAAO,aAAa,IAAI,OAAQ,IAAmB,MAAM;EAC3D,QACE,0BAAY,IAAI;;;AAItB,SAAS,sBAAsB,KAAyB,KAAiC;CACvF,MAAM,MAAM,aAAa,IAAI,OAAO,IAAI,MAAM;AAC9C,KAAI,QAAQ,EAAG,QAAO;AACtB,KAAI,IAAI,eAAe,WAAW,IAAI,eAAe,OACnD,QAAO,IAAI,eAAe,SAAS,IAAI,eAAe;AAExD,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,eAAe,QAAQ,KAAK;EAClD,MAAM,OAAOA,8BAAiB,IAAI,eAAe,GAAG;EACpD,MAAM,OAAOA,8BAAiB,IAAI,eAAe,GAAG;AACpD,MAAI,SAAS,KAAM,QAAO,OAAO,OAAO,KAAK;;AAE/C,QAAO"}
|