@narrative.io/data-collaboration-sdk-ts 0.0.123 → 0.0.125

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/build/index.d.ts CHANGED
@@ -16,7 +16,7 @@ import { type PingStatus } from "./ping/types";
16
16
  import { type Product, ProductsApi } from "./products";
17
17
  import { CompanyInfoApi, type CompanyInfo } from "./company-info";
18
18
  import { InstallationsApi, type Installation } from "./installations";
19
- import { NqlApi, type Nql, type NqlField, type NqlResult, type NqlQueryInput, type NqlCompileResult, type NqlExpression, type NqlWhere, type NqlFilterExpression, type NqlBooleanExpression, type NqlFilterBinaryExpression, type NqlFilterUnaryExpression } from "./nql";
19
+ import { NqlApi, type CompiledNql, type CreateMaterializedView, type Deduplication, type Explain, type Expression, type Raw, type Select, type Statement, type Table, type Nql, type NqlAst, type NqlField, type NqlResult, type NqlQueryInput, type NqlCompileResult, type NqlExpression, type NqlWhere, type NqlFilterExpression, type NqlBooleanExpression, type NqlFilterBinaryExpression, type NqlFilterUnaryExpression, compileStatement, parseStatement } from "./nql";
20
20
  import { DataStreamsApi, type DataStream, type DataRules, type ColumnSet, type ColumnWithFilterAndExport, type AttributeSet } from "./data-streams";
21
21
  import { ForecastApi, type ForecastRequest, type ForecastResponse, type CostForecastRequest, type CostForecastResponse, type JobState } from "./forecast";
22
22
  import { ContractsApi, type ContractDetails, type CustomerContract, type PaymentMethod, type ContractRateView } from "./contracts";
@@ -33,4 +33,4 @@ declare class NarrativeApi extends BaseApi {
33
33
  }
34
34
  interface NarrativeApi extends BaseApi, HealthCheckApi, DatasetApi, RosettaStoneApi, AttributeApi, PingApi, CompanyInfoApi, InstallationsApi, UploadsApi, ResourceApi, NqlApi, DataStreamsApi, ForecastApi, ContractsApi, AuthenticationApi, MappingsApi, AccessRulesApi, AppsApi, SubscriptionsApi {
35
35
  }
36
- export { NarrativeApi, AttributeApi, HealthCheckApi, DatasetApi, PingApi, ProductsApi, CompanyInfoApi, InstallationsApi, UploadsApi, ResourceApi, NqlApi, DataStreamsApi, ForecastApi, ContractsApi, AuthenticationApi, AppsApi, MappingsApi, AccessRulesApi, SubscriptionsApi, getNqlObject, buildNql, convertNqlObjectToForecastBody, isConversationAssistantMessage, isConversationFunctionMessage, isConversationInputMessage, isConversationMessage, isConversationMessageName, isConversationMessageRole, isConversationMessages, isConversationSystemMessage, isConversationUserMessage, isType, isConversationMessageFunctionCall, isConversationAssistantMessageWithFunctionCall, isRosettaRequestMessage, isConversationAssistantMessageWithoutFunctionCall, type App, type Resource, type UploadsResponse, type PingStatus, type Attribute, type ShallowAttribute, type RefAttribute, type SubAttribute, type PrimitiveAttribute, type ArrayAttribute, type ObjectAttribute, type Environment, type Config, type ApiRecords, type Dataset, type HealthCheckResult, type SampleRecords, type DatasetTableSummary, type DatasetTableSummaryAPIResponse, type UpdateDatasetRequest, type SchemaFileConfigType, type SchemaPropertiesType, type DatasetStatus, type DatasetWriteMode, type SchemaFileConfig, type SchemaProperties, type SchemaArrayProperty, type Schema, type AdvancedStatisticsMetadata, type SnapshotRange, type Configuration, type Columns, type ColumnSummary, type BasicStatistics, type AdvancedStatistics, type Histogram, type Value, type Product, type MonetaryAmount, type CompanyInfo, type Installation, type FilePerSnapshotResponse, type BucketCreationRequest, type UpdateAccessTypeRequest, type Nql, type NqlField, type NqlResult, type NqlQueryInput, type NqlCompileResult, type NqlExpression, type NqlWhere, type NqlFilterExpression, type NqlBooleanExpression, type NqlFilterBinaryExpression, type NqlFilterUnaryExpression, type DataStream, type DataRules, type ColumnSet, type ColumnWithFilterAndExport, type AttributeSet, type ForecastRequest, type ForecastResponse, type CostForecastRequest, type CostForecastResponse, type JobState, type ContractDetails, type CustomerContract, type PaymentMethod, type ContractRateView, type LoginRequest, type LoginResponse, type RegisterRequest, type RegisterResponse, type LoggedInUser, type StytchToken, type ApiToken, type UserRole, type RegistrationStatus, type RegistrationStatusRequest, type RegistrationStatusResponse, type ForecastBody, type ConversationAssistantMessage, type ConversationFunctionMessage, type ConversationIOMessage, type ConversationMessage, type ConversationMessageName, type ConversationMessageRole, type ConversationMessages, type ConversationSystemMessage, type ConversationUserMessage, type RosettaRequestMessage, type ConversationMessageFunctionCall, type ConversationAssistantMessageWithFunctionCall, type RosettaResponseMessage, type ConversationAssistantMessageWithoutFunctionCall, type RetentionPolicy, type AccessRule, type Subscription, type SubscriptionDetails, type DataStreamSubscriptionDetails, type MarketplaceSubscriptionDetails, type SubscriptionOutput, type SubscriptionType, type SubscriptionStatus, type SubscriptionBudget, };
36
+ export { NarrativeApi, AttributeApi, HealthCheckApi, DatasetApi, PingApi, ProductsApi, CompanyInfoApi, InstallationsApi, UploadsApi, ResourceApi, NqlApi, DataStreamsApi, ForecastApi, ContractsApi, AuthenticationApi, AppsApi, MappingsApi, AccessRulesApi, SubscriptionsApi, getNqlObject, buildNql, convertNqlObjectToForecastBody, isConversationAssistantMessage, isConversationFunctionMessage, isConversationInputMessage, isConversationMessage, isConversationMessageName, isConversationMessageRole, isConversationMessages, isConversationSystemMessage, isConversationUserMessage, isType, isConversationMessageFunctionCall, isConversationAssistantMessageWithFunctionCall, isRosettaRequestMessage, isConversationAssistantMessageWithoutFunctionCall, type App, type Resource, type UploadsResponse, type PingStatus, type Attribute, type ShallowAttribute, type RefAttribute, type SubAttribute, type PrimitiveAttribute, type ArrayAttribute, type ObjectAttribute, type Environment, type Config, type ApiRecords, type Dataset, type HealthCheckResult, type SampleRecords, type DatasetTableSummary, type DatasetTableSummaryAPIResponse, type UpdateDatasetRequest, type SchemaFileConfigType, type SchemaPropertiesType, type DatasetStatus, type DatasetWriteMode, type SchemaFileConfig, type SchemaProperties, type SchemaArrayProperty, type Schema, type AdvancedStatisticsMetadata, type SnapshotRange, type Configuration, type Columns, type ColumnSummary, type BasicStatistics, type AdvancedStatistics, type Histogram, type Value, type Product, type MonetaryAmount, type CompanyInfo, type Installation, type FilePerSnapshotResponse, type BucketCreationRequest, type UpdateAccessTypeRequest, type CompiledNql, type CreateMaterializedView, type Deduplication, type Explain, type Expression, type Raw, type Select, type Statement, type Table, type Nql, type NqlAst, type NqlField, type NqlResult, type NqlQueryInput, type NqlCompileResult, type NqlExpression, type NqlWhere, type NqlFilterExpression, type NqlBooleanExpression, type NqlFilterBinaryExpression, type NqlFilterUnaryExpression, type DataStream, type DataRules, type ColumnSet, type ColumnWithFilterAndExport, type AttributeSet, type ForecastRequest, type ForecastResponse, type CostForecastRequest, type CostForecastResponse, type JobState, type ContractDetails, type CustomerContract, type PaymentMethod, type ContractRateView, type LoginRequest, type LoginResponse, type RegisterRequest, type RegisterResponse, type LoggedInUser, type StytchToken, type ApiToken, type UserRole, type RegistrationStatus, type RegistrationStatusRequest, type RegistrationStatusResponse, type ForecastBody, type ConversationAssistantMessage, type ConversationFunctionMessage, type ConversationIOMessage, type ConversationMessage, type ConversationMessageName, type ConversationMessageRole, type ConversationMessages, type ConversationSystemMessage, type ConversationUserMessage, type RosettaRequestMessage, type ConversationMessageFunctionCall, type ConversationAssistantMessageWithFunctionCall, type RosettaResponseMessage, type ConversationAssistantMessageWithoutFunctionCall, type RetentionPolicy, type AccessRule, type Subscription, type SubscriptionDetails, type DataStreamSubscriptionDetails, type MarketplaceSubscriptionDetails, type SubscriptionOutput, type SubscriptionType, type SubscriptionStatus, type SubscriptionBudget, compileStatement, parseStatement, };
package/build/index.js CHANGED
@@ -10,7 +10,7 @@ import { UploadsApi } from "./uploads";
10
10
  import { ProductsApi } from "./products";
11
11
  import { CompanyInfoApi } from "./company-info";
12
12
  import { InstallationsApi } from "./installations";
13
- import { NqlApi, } from "./nql";
13
+ import { NqlApi, compileStatement, parseStatement, } from "./nql";
14
14
  import { DataStreamsApi, } from "./data-streams";
15
15
  import { ForecastApi, } from "./forecast";
16
16
  import { ContractsApi, } from "./contracts";
@@ -45,4 +45,4 @@ applyMixins(NarrativeApi, [
45
45
  AccessRulesApi,
46
46
  SubscriptionsApi,
47
47
  ]);
48
- export { NarrativeApi, AttributeApi, HealthCheckApi, DatasetApi, PingApi, ProductsApi, CompanyInfoApi, InstallationsApi, UploadsApi, ResourceApi, NqlApi, DataStreamsApi, ForecastApi, ContractsApi, AuthenticationApi, AppsApi, MappingsApi, AccessRulesApi, SubscriptionsApi, getNqlObject, buildNql, convertNqlObjectToForecastBody, isConversationAssistantMessage, isConversationFunctionMessage, isConversationInputMessage, isConversationMessage, isConversationMessageName, isConversationMessageRole, isConversationMessages, isConversationSystemMessage, isConversationUserMessage, isType, isConversationMessageFunctionCall, isConversationAssistantMessageWithFunctionCall, isRosettaRequestMessage, isConversationAssistantMessageWithoutFunctionCall, };
48
+ export { NarrativeApi, AttributeApi, HealthCheckApi, DatasetApi, PingApi, ProductsApi, CompanyInfoApi, InstallationsApi, UploadsApi, ResourceApi, NqlApi, DataStreamsApi, ForecastApi, ContractsApi, AuthenticationApi, AppsApi, MappingsApi, AccessRulesApi, SubscriptionsApi, getNqlObject, buildNql, convertNqlObjectToForecastBody, isConversationAssistantMessage, isConversationFunctionMessage, isConversationInputMessage, isConversationMessage, isConversationMessageName, isConversationMessageRole, isConversationMessages, isConversationSystemMessage, isConversationUserMessage, isType, isConversationMessageFunctionCall, isConversationAssistantMessageWithFunctionCall, isRosettaRequestMessage, isConversationAssistantMessageWithoutFunctionCall, compileStatement, parseStatement, };
@@ -174,9 +174,9 @@ interface NqlExplain {
174
174
  query: NqlAst;
175
175
  type: "explain";
176
176
  }
177
- type NqlAstList = NqlAst[] & {
177
+ interface NqlAstList extends Array<NqlAst> {
178
178
  type: "ast_list";
179
- };
179
+ }
180
180
  export declare function isAstArray(n: NqlAst): n is NqlAstList;
181
181
  type NqlAst = {
182
182
  type: string;
@@ -1,8 +1,19 @@
1
1
  import * as ast from "./Ast";
2
+ type Statement = CreateMaterializedView | Explain;
3
+ interface CreateMaterializedView {
4
+ type: "create_materialized_view";
5
+ name: string;
6
+ select: Select;
7
+ }
8
+ interface Explain {
9
+ type: "explain";
10
+ query: Select;
11
+ }
2
12
  interface Select {
3
13
  type: "select";
4
14
  budget: ast.NqlBudget | null;
5
15
  columns: Expression[];
16
+ deduplication: Deduplication | Raw | null;
6
17
  from: Table[] | Raw;
7
18
  where: BooleanExpression | Raw | null;
8
19
  }
@@ -12,6 +23,10 @@ interface Raw {
12
23
  as?: string;
13
24
  nql: string;
14
25
  }
26
+ interface Deduplication {
27
+ type: "deduplication";
28
+ expressions: Expression[];
29
+ }
15
30
  type ColumnRef = AttributeRef | DatasetColumnRef | RawRef;
16
31
  type ArithmeticExpression = BinaryArithmeticExpression | UnaryMinus;
17
32
  type BinaryArithmeticExpression = Add | Divide | Multiply | Subtract;
@@ -179,8 +194,12 @@ interface Concat {
179
194
  as?: string;
180
195
  operands: Expression[];
181
196
  }
182
- export type { Expression, Raw, Select, Table };
197
+ export type { CreateMaterializedView, Deduplication, Explain, Expression, Raw, Select, Statement, Table, };
198
+ export declare function parseStatement(n: ast.NqlAst): Statement | Raw;
199
+ export declare function parseCreateMaterializedView(n: ast.NqlCreateMaterializedView): CreateMaterializedView;
200
+ export declare function parseExplain(n: ast.NqlExplain): Explain | Raw;
183
201
  export declare function parseSelect(n: ast.NqlSelect): Select;
184
202
  export declare function parseFrom(n: ast.NqlAst): Table[];
185
203
  export declare function parseWhere(n: ast.NqlAst): BooleanExpression | Raw;
204
+ export declare function parseDeduplication(n: ast.NqlSelect): Deduplication | Raw | null;
186
205
  export declare function parseExpression(n: ast.NqlAst): Expression;
@@ -1,9 +1,42 @@
1
1
  import * as ast from "./Ast";
2
+ export function parseStatement(n) {
3
+ switch (n.type) {
4
+ case "create_materialized_view":
5
+ return parseCreateMaterializedView(n);
6
+ case "explain":
7
+ return parseExplain(n);
8
+ default:
9
+ return nqlOrFail(n);
10
+ }
11
+ }
12
+ export function parseCreateMaterializedView(n) {
13
+ const select = parseSelect(n.select);
14
+ const create = {
15
+ type: "create_materialized_view",
16
+ name: n.name,
17
+ select,
18
+ };
19
+ return create;
20
+ }
21
+ export function parseExplain(n) {
22
+ switch (n.query.type) {
23
+ case "select": {
24
+ const explain = {
25
+ type: "explain",
26
+ query: parseSelect(n.query),
27
+ };
28
+ return explain;
29
+ }
30
+ default:
31
+ return nqlOrFail(n);
32
+ }
33
+ }
2
34
  export function parseSelect(n) {
3
35
  const select = {
4
36
  type: "select",
5
37
  budget: n.budget,
6
38
  columns: n.columns.map((col) => parseExpression(col)),
39
+ deduplication: parseDeduplication(n),
7
40
  from: n.from !== null ? parseFrom(n.from) : [],
8
41
  where: n.where !== null ? parseWhere(n.where) : null,
9
42
  };
@@ -34,6 +67,38 @@ export function parseWhere(n) {
34
67
  return nqlOrFail(n);
35
68
  }
36
69
  }
70
+ // Expect deduplication to be a qualify clause of the form:
71
+ // row_number() over(partition by $expr0, $expr1, ... order by 0) = 1
72
+ export function parseDeduplication(n) {
73
+ if (n.qualify !== null &&
74
+ n.qualify.type === "binary_op" &&
75
+ n.qualify.name === "=" &&
76
+ n.qualify.left.type === "binary_op" &&
77
+ n.qualify.left.name === "OVER" &&
78
+ n.qualify.left.left.type === "agg_function" &&
79
+ n.qualify.left.left.name === "ROW_NUMBER" &&
80
+ n.qualify.left.right.type === "window" &&
81
+ n.qualify.left.right.order_by.length === 1 &&
82
+ n.qualify.left.right.order_by[0].type === "literal" &&
83
+ n.qualify.left.right.order_by[0].value_type.type === "long" &&
84
+ n.qualify.left.right.order_by[0].value === "0" &&
85
+ n.qualify.left.right.lower_bound === null &&
86
+ n.qualify.left.right.upper_bound === null &&
87
+ n.qualify.left.right.partitions.length > 0 &&
88
+ // assert all partition expression are known/knowable
89
+ !n.qualify.left.right.partitions.some((e) => parseExpression(e).type === "nql") &&
90
+ n.qualify.right.type === "literal" &&
91
+ n.qualify.right.value_type.type === "long" &&
92
+ n.qualify.right.value === "1") {
93
+ const partitions = n.qualify.left.right.partitions.map(parseExpression);
94
+ const dedup = {
95
+ type: "deduplication",
96
+ expressions: partitions,
97
+ };
98
+ return dedup;
99
+ }
100
+ return n.qualify !== null ? nqlOrFail(n.qualify) : null;
101
+ }
37
102
  export function parseExpression(n) {
38
103
  const parse = oneOf(parseArithmetic, parseBooleanExpression, parseColumnRef, parseFunctionCall, parseLit, parseStringExpression);
39
104
  return parse(n);
@@ -93,7 +93,7 @@ function parseFieldFromString(fieldStr) {
93
93
  },
94
94
  field: f
95
95
  .map((field) => {
96
- return field.replace('"value"', "value").replace('"type"', "type");
96
+ return field.replace("`value`", "value").replace("`type`", "type");
97
97
  })
98
98
  .join("."),
99
99
  };
@@ -1,8 +1,11 @@
1
1
  import { type NqlBudget } from "./Ast";
2
- import { type Select, type Expression, type Raw, type Table } from "./AstParser";
3
- type CompiledNql = string;
2
+ import { type CreateMaterializedView, type Deduplication, type Explain, type Expression, type Raw, type Select, type Statement, type Table } from "./AstParser";
3
+ export type CompiledNql = string;
4
+ export declare function compileStatement(n: Statement): CompiledNql;
5
+ export declare function compileCreateMaterializedView(n: CreateMaterializedView): CompiledNql;
6
+ export declare function compileExplain(n: Explain): CompiledNql;
4
7
  export declare function compileSelect(q: Select): CompiledNql;
5
8
  export declare function compileBudget(budget: NqlBudget): CompiledNql;
9
+ export declare function compileDeduplication(d: Deduplication | Raw): CompiledNql;
6
10
  export declare function compileFrom(tables: Table[] | Raw): CompiledNql;
7
11
  export declare function compileExpression(n: Expression): CompiledNql;
8
- export {};
@@ -1,11 +1,31 @@
1
1
  const quoteChar = '"';
2
+ export function compileStatement(n) {
3
+ switch (n.type) {
4
+ case "create_materialized_view":
5
+ return compileCreateMaterializedView(n);
6
+ case "explain":
7
+ return compileExplain(n);
8
+ default:
9
+ return unreachable(n);
10
+ }
11
+ }
12
+ export function compileCreateMaterializedView(n) {
13
+ // eslint-disable-next-line prettier/prettier
14
+ return `CREATE MATERIALIZE VIEW ${quote(n.name)} (${compileSelect(n.select)})`;
15
+ }
16
+ export function compileExplain(n) {
17
+ return `EXPLAIN ${compileSelect(n.query)}`;
18
+ }
2
19
  export function compileSelect(q) {
3
20
  const columns = q.columns.map((e) => compileExpression(e));
4
21
  const select = `SELECT ${columns.join(", ")}`;
5
22
  const budget = q.budget !== null ? compileBudget(q.budget) : "";
6
23
  const from = `FROM ${compileFrom(q.from)}`;
7
24
  const where = q.where !== null ? `WHERE ${compileExpression(q.where)}` : "";
8
- return `${select} ${from} ${where} ${budget}`;
25
+ const qualify = q.deduplication !== null
26
+ ? `QUALIFY ${compileDeduplication(q.deduplication)}`
27
+ : "";
28
+ return `${select} ${from} ${where} ${qualify} ${budget}`;
9
29
  }
10
30
  export function compileBudget(budget) {
11
31
  let period;
@@ -24,6 +44,15 @@ export function compileBudget(budget) {
24
44
  // eslint-disable-next-line prettier/prettier
25
45
  return `LIMIT ${budget.amount.value} ${budget.amount.currency.toUpperCase()} ${period}`;
26
46
  }
47
+ export function compileDeduplication(d) {
48
+ if (d.type === "deduplication") {
49
+ const expressions = d.expressions.map(compileExpression).join(", ");
50
+ return `ROW_NUMBER() OVER (PARTITION BY ${expressions} ORDER BY 0) = 1`;
51
+ }
52
+ else {
53
+ return raw(d);
54
+ }
55
+ }
27
56
  export function compileFrom(tables) {
28
57
  if (isArray(tables)) {
29
58
  return compileTableRefs(tables);
@@ -1,5 +1,4 @@
1
1
  import { BaseApi } from "../base-api";
2
- import type { Plan } from "./SubstraitParser";
3
2
  import { type NqlAst } from "./Ast";
4
3
  import type { Nql, NqlField, NqlResult, NqlCompileResult, NqlQueryInput, NqlExpression, NqlWhere, NqlFilterBinaryExpression, NqlBooleanExpression, NqlFilterExpression, NqlFilterUnaryExpression } from "./types";
5
4
  /**
@@ -27,7 +26,7 @@ declare class NqlApi extends BaseApi {
27
26
  * @param {string} nqlQuery - The NQL query to compile.
28
27
  * @returns {Promise<NqlCompileResult>} A promise that resolves with the result of the NQL compilation.
29
28
  */
30
- parseNql(nqlQuery: NqlQueryInput): Promise<Plan>;
29
+ parseNql(nqlQuery: NqlQueryInput): Promise<NqlAst>;
31
30
  /**
32
31
  * Validates an NQL query and returns an abstract syntax tree (AST) representing a structured form of
33
32
  * the query.
@@ -44,4 +43,7 @@ declare class NqlApi extends BaseApi {
44
43
  */
45
44
  getNqlByJobId(id: string): Promise<NqlResult>;
46
45
  }
47
- export { NqlApi, type Nql, type NqlAst, type NqlField, type NqlResult, type NqlQueryInput, type NqlCompileResult, type NqlExpression, type NqlWhere, type NqlFilterExpression, type NqlBooleanExpression, type NqlFilterBinaryExpression, type NqlFilterUnaryExpression, };
46
+ export { NqlApi, type Nql, type NqlField, type NqlResult, type NqlQueryInput, type NqlCompileResult, type NqlExpression, type NqlWhere, type NqlFilterExpression, type NqlBooleanExpression, type NqlFilterBinaryExpression, type NqlFilterUnaryExpression, };
47
+ export * from "./Ast";
48
+ export * from "./AstParser";
49
+ export * from "./NqlBuilder";
@@ -64,3 +64,6 @@ class NqlApi extends BaseApi {
64
64
  }
65
65
  }
66
66
  export { NqlApi, };
67
+ export * from "./Ast";
68
+ export * from "./AstParser";
69
+ export * from "./NqlBuilder";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@narrative.io/data-collaboration-sdk-ts",
3
- "version": "0.0.123",
3
+ "version": "0.0.125",
4
4
  "main": "build/index.js",
5
5
  "repository": "github:narrative-io/data-collaboration-sdk-ts",
6
6
  "source": "src/index.ts",