This is an automated email from the ASF dual-hosted git repository.
cwylie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new f6aca21e82 Web console: update DQT to version 0.17 (#13323)
f6aca21e82 is described below
commit f6aca21e8203c003e6467d0112840a63223bc859
Author: Vadim Ogievetsky <[email protected]>
AuthorDate: Mon Nov 7 17:47:11 2022 -0800
Web console: update DQT to version 0.17 (#13323)
* update to DQT 17
* update licenses
* after npm i
---
licenses.yaml | 2 +-
web-console/e2e-tests/tutorial-batch.spec.ts | 4 +-
web-console/package-lock.json | 14 +--
web-console/package.json | 2 +-
.../cell-filter-menu/cell-filter-menu.tsx | 21 +++--
.../record-table-pane/record-table-pane.tsx | 4 +-
.../datasource-columns-table.tsx | 4 +-
.../datasource-preview-pane.tsx | 4 +-
.../lookup-values-table/lookup-values-table.tsx | 4 +-
.../external-config/external-config.ts | 17 ++--
.../ingest-query-pattern/ingest-query-pattern.ts | 8 +-
.../workbench-query/workbench-query-part.ts | 8 +-
.../workbench-query/workbench-query.ts | 15 ++-
.../src/helpers/execution/sql-task-execution.ts | 4 +-
web-console/src/helpers/spec-conversion.ts | 101 ++++++++++-----------
web-console/src/react-table/react-table-utils.ts | 17 ++--
web-console/src/utils/druid-query.ts | 4 +-
web-console/src/utils/query-cursor.ts | 15 +--
web-console/src/utils/sample-query.tsx | 20 ++--
web-console/src/utils/sql.ts | 4 +-
.../views/datasources-view/datasources-view.tsx | 5 +-
.../src/views/segments-view/segments-view.tsx | 21 +++--
.../column-actions/column-actions.tsx | 47 ++++------
.../ingestion-progress-dialog.tsx | 4 +-
.../expression-entry/expression-entry.tsx | 4 +-
.../schema-step/preview-table/preview-table.tsx | 4 +-
.../rollup-analysis-pane/rollup-analysis-pane.tsx | 12 +--
.../schema-step/schema-step.tsx | 22 ++---
.../sql-data-loader-view/sql-data-loader-view.tsx | 2 +-
.../number-menu-items/number-menu-items.tsx | 38 ++++----
.../string-menu-items/string-menu-items.tsx | 83 +++++++----------
.../time-menu-items/time-menu-items.tsx | 58 ++++--------
.../workbench-view/column-tree/column-tree.tsx | 67 ++++++++------
.../flexible-query-input/flexible-query-input.tsx | 8 +-
.../ingest-success-pane/ingest-success-pane.tsx | 4 +-
.../input-format-step/input-format-step.tsx | 4 +-
.../recent-query-task-panel.tsx | 8 +-
.../result-table-pane/result-table-pane.tsx | 57 ++++--------
.../time-floor-menu-item/time-floor-menu-item.tsx | 22 ++---
39 files changed, 322 insertions(+), 420 deletions(-)
diff --git a/licenses.yaml b/licenses.yaml
index e20e0119cb..5b70fadb1d 100644
--- a/licenses.yaml
+++ b/licenses.yaml
@@ -5683,7 +5683,7 @@ license_category: binary
module: web-console
license_name: Apache License version 2.0
copyright: Imply Data
-version: 0.16.1
+version: 0.17.1
---
diff --git a/web-console/e2e-tests/tutorial-batch.spec.ts
b/web-console/e2e-tests/tutorial-batch.spec.ts
index 9420f74def..914850a96a 100644
--- a/web-console/e2e-tests/tutorial-batch.spec.ts
+++ b/web-console/e2e-tests/tutorial-batch.spec.ts
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-import { SqlTableRef } from 'druid-query-toolkit';
+import { T } from 'druid-query-toolkit';
import * as playwright from 'playwright-chromium';
import { DatasourcesOverview } from './component/datasources/overview';
@@ -167,7 +167,7 @@ async function validateDatasourceStatus(page:
playwright.Page, datasourceName: s
async function validateQuery(page: playwright.Page, datasourceName: string) {
const queryOverview = new QueryOverview(page, UNIFIED_CONSOLE_URL);
- const query = `SELECT * FROM ${SqlTableRef.create(datasourceName)} ORDER BY
__time`;
+ const query = `SELECT * FROM ${T(datasourceName)} ORDER BY __time`;
const results = await queryOverview.runQuery(query);
expect(results).toBeDefined();
expect(results.length).toBeGreaterThan(0);
diff --git a/web-console/package-lock.json b/web-console/package-lock.json
index 31d0a107ac..c78e7c0c7f 100644
--- a/web-console/package-lock.json
+++ b/web-console/package-lock.json
@@ -22,7 +22,7 @@
"d3-axis": "^2.1.0",
"d3-scale": "^3.3.0",
"d3-selection": "^2.0.0",
- "druid-query-toolkit": "^0.16.1",
+ "druid-query-toolkit": "^0.17.1",
"file-saver": "^2.0.2",
"follow-redirects": "^1.14.7",
"fontsource-open-sans": "^3.0.9",
@@ -8967,9 +8967,9 @@
}
},
"node_modules/druid-query-toolkit": {
- "version": "0.16.1",
- "resolved":
"https://registry.npmjs.org/druid-query-toolkit/-/druid-query-toolkit-0.16.1.tgz",
- "integrity":
"sha512-HiovpGh1m2QTvexBX1AvQAz5ONc9sChazL0hsXl0qEvHcIQ69pksJZWXZOStBI2T9fJAXQpSUVB4DUSdE6UXmQ==",
+ "version": "0.17.1",
+ "resolved":
"https://registry.npmjs.org/druid-query-toolkit/-/druid-query-toolkit-0.17.1.tgz",
+ "integrity":
"sha512-uXybPbUgY5fKMRSduPKSTLHQ8zhfvGT2/jWl+fPIXruFjFnZTDp8YPkJtYq1LzSCvEfgKLw1vwBtNhyUY/CdVg==",
"dependencies": {
"tslib": "^2.3.1"
},
@@ -34591,9 +34591,9 @@
}
},
"druid-query-toolkit": {
- "version": "0.16.1",
- "resolved":
"https://registry.npmjs.org/druid-query-toolkit/-/druid-query-toolkit-0.16.1.tgz",
- "integrity":
"sha512-HiovpGh1m2QTvexBX1AvQAz5ONc9sChazL0hsXl0qEvHcIQ69pksJZWXZOStBI2T9fJAXQpSUVB4DUSdE6UXmQ==",
+ "version": "0.17.1",
+ "resolved":
"https://registry.npmjs.org/druid-query-toolkit/-/druid-query-toolkit-0.17.1.tgz",
+ "integrity":
"sha512-uXybPbUgY5fKMRSduPKSTLHQ8zhfvGT2/jWl+fPIXruFjFnZTDp8YPkJtYq1LzSCvEfgKLw1vwBtNhyUY/CdVg==",
"requires": {
"tslib": "^2.3.1"
}
diff --git a/web-console/package.json b/web-console/package.json
index 1d08bc4c4e..24875698c5 100644
--- a/web-console/package.json
+++ b/web-console/package.json
@@ -79,7 +79,7 @@
"d3-axis": "^2.1.0",
"d3-scale": "^3.3.0",
"d3-selection": "^2.0.0",
- "druid-query-toolkit": "^0.16.1",
+ "druid-query-toolkit": "^0.17.1",
"file-saver": "^2.0.2",
"follow-redirects": "^1.14.7",
"fontsource-open-sans": "^3.0.9",
diff --git a/web-console/src/components/cell-filter-menu/cell-filter-menu.tsx
b/web-console/src/components/cell-filter-menu/cell-filter-menu.tsx
index a5e9022537..20d200b6f9 100644
--- a/web-console/src/components/cell-filter-menu/cell-filter-menu.tsx
+++ b/web-console/src/components/cell-filter-menu/cell-filter-menu.tsx
@@ -19,13 +19,14 @@
import { Menu, MenuItem } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
import {
+ C,
Column,
+ L,
SqlComparison,
SqlExpression,
SqlLiteral,
SqlQuery,
SqlRecord,
- SqlRef,
trimString,
} from 'druid-query-toolkit';
import React from 'react';
@@ -36,7 +37,7 @@ function sqlLiteralForColumnValue(column: Column, value:
unknown): SqlLiteral |
if (column.sqlType === 'TIMESTAMP') {
const asDate = new Date(value as any);
if (!isNaN(asDate.valueOf())) {
- return SqlLiteral.create(asDate);
+ return L(asDate);
}
}
@@ -112,14 +113,14 @@ export function CellFilterMenu(props:
CellFilterMenuProps) {
let ex: SqlExpression | undefined;
let having = false;
if (query.hasStarInSelect()) {
- ex = SqlRef.column(column.name);
+ ex = C(column.name);
} else {
const selectValue = query.getSelectExpressionForIndex(headerIndex);
if (selectValue) {
const outputName = selectValue.getOutputName();
having = query.isAggregateSelectIndex(headerIndex);
if (having && outputName) {
- ex = SqlRef.column(outputName);
+ ex = C(outputName);
} else {
ex = selectValue.getUnderlyingExpression();
}
@@ -133,11 +134,11 @@ export function CellFilterMenu(props:
CellFilterMenuProps) {
icon={IconNames.FILTER}
text={`${having ? 'Having' : 'Filter on'}:
${prettyPrintSql(clause)}`}
onClick={() => {
- const column = clause.getUsedColumns()[0];
+ const columnName = clause.getUsedColumnNames()[0];
onQueryAction(
having
- ? q => q.removeFromHaving(column).addHaving(clause)
- : q => q.removeColumnFromWhere(column).addWhere(clause),
+ ? q => q.removeFromHaving(columnName).addHaving(clause)
+ : q => q.removeColumnFromWhere(columnName).addWhere(clause),
);
}}
/>
@@ -151,7 +152,7 @@ export function CellFilterMenu(props: CellFilterMenuProps) {
const currentClauses =
currentFilterExpression
?.decomposeViaAnd()
- ?.filter(ex => String(ex.getUsedColumns()) === column.name) || [];
+ ?.filter(ex => String(ex.getUsedColumnNames()) === column.name) || [];
const updatedClause =
currentClauses.length === 1 && val ? addToClause(currentClauses[0], val)
: undefined;
@@ -160,7 +161,7 @@ export function CellFilterMenu(props: CellFilterMenuProps) {
const jsonColumn = column.nativeType === 'COMPLEX<json>';
return (
<Menu>
- {ex?.getFirstColumn() && val && !jsonColumn && (
+ {ex?.getFirstColumnName() && val && !jsonColumn && (
<>
{updatedClause && filterOnMenuItem(updatedClause)}
{filterOnMenuItem(ex.equal(val))}
@@ -177,7 +178,7 @@ export function CellFilterMenu(props: CellFilterMenuProps) {
</Menu>
);
} else {
- const ref = SqlRef.column(column.name);
+ const ref = C(column.name);
const stringValue = stringifyValue(value);
const trimmedValue = trimString(stringValue, 50);
return (
diff --git a/web-console/src/components/record-table-pane/record-table-pane.tsx
b/web-console/src/components/record-table-pane/record-table-pane.tsx
index 1cd5833f56..e3f26ad18d 100644
--- a/web-console/src/components/record-table-pane/record-table-pane.tsx
+++ b/web-console/src/components/record-table-pane/record-table-pane.tsx
@@ -66,8 +66,8 @@ export const RecordTablePane = React.memo(function
RecordTablePane(props: Record
if (!parsedQuery ||
!parsedQuery.isRealOutputColumnAtSelectIndex(headerIndex)) return false;
return (
- parsedQuery.getEffectiveWhereExpression().containsColumn(header) ||
- parsedQuery.getEffectiveHavingExpression().containsColumn(header)
+ parsedQuery.getEffectiveWhereExpression().containsColumnName(header) ||
+ parsedQuery.getEffectiveHavingExpression().containsColumnName(header)
);
}
diff --git
a/web-console/src/dialogs/datasource-table-action-dialog/datasource-columns-table/datasource-columns-table.tsx
b/web-console/src/dialogs/datasource-table-action-dialog/datasource-columns-table/datasource-columns-table.tsx
index cd56dda85f..242ca19378 100644
---
a/web-console/src/dialogs/datasource-table-action-dialog/datasource-columns-table/datasource-columns-table.tsx
+++
b/web-console/src/dialogs/datasource-table-action-dialog/datasource-columns-table/datasource-columns-table.tsx
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-import { SqlLiteral } from 'druid-query-toolkit';
+import { L } from 'druid-query-toolkit';
import React from 'react';
import ReactTable from 'react-table';
@@ -44,7 +44,7 @@ export const DatasourceColumnsTable = React.memo(function
DatasourceColumnsTable
processQuery: async (datasourceId: string) => {
return await queryDruidSql<ColumnMetadata>({
query: `SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
- WHERE TABLE_SCHEMA = 'druid' AND TABLE_NAME =
${SqlLiteral.create(datasourceId)}`,
+ WHERE TABLE_SCHEMA = 'druid' AND TABLE_NAME = ${L(datasourceId)}`,
});
},
});
diff --git
a/web-console/src/dialogs/datasource-table-action-dialog/datasource-preview-pane/datasource-preview-pane.tsx
b/web-console/src/dialogs/datasource-table-action-dialog/datasource-preview-pane/datasource-preview-pane.tsx
index 71c20d2202..8f3d664e93 100644
---
a/web-console/src/dialogs/datasource-table-action-dialog/datasource-preview-pane/datasource-preview-pane.tsx
+++
b/web-console/src/dialogs/datasource-table-action-dialog/datasource-preview-pane/datasource-preview-pane.tsx
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-import { QueryResult, QueryRunner, SqlTableRef } from 'druid-query-toolkit';
+import { QueryResult, QueryRunner, T } from 'druid-query-toolkit';
import React from 'react';
import { Loader, RecordTablePane } from '../../../components';
@@ -42,7 +42,7 @@ export const DatasourcePreviewPane = React.memo(function
DatasourcePreviewPane(
let result: QueryResult;
try {
result = await queryRunner.runQuery({
- query: `SELECT * FROM ${SqlTableRef.create(datasource)}`,
+ query: `SELECT * FROM ${T(datasource)}`,
extraQueryContext: { sqlOuterLimit: 100 },
cancelToken,
});
diff --git
a/web-console/src/dialogs/lookup-table-action-dialog/lookup-values-table/lookup-values-table.tsx
b/web-console/src/dialogs/lookup-table-action-dialog/lookup-values-table/lookup-values-table.tsx
index 2ffa3ecc22..ec962c4083 100644
---
a/web-console/src/dialogs/lookup-table-action-dialog/lookup-values-table/lookup-values-table.tsx
+++
b/web-console/src/dialogs/lookup-table-action-dialog/lookup-values-table/lookup-values-table.tsx
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-import { SqlRef } from 'druid-query-toolkit';
+import { N } from 'druid-query-toolkit';
import React from 'react';
import ReactTable from 'react-table';
@@ -43,7 +43,7 @@ export const LookupValuesTable = React.memo(function
LookupValuesTable(
const [entriesState] = useQueryManager<string, LookupRow[]>({
processQuery: async (lookupId: string) => {
return await queryDruidSql<LookupRow>({
- query: `SELECT "k", "v" FROM ${SqlRef.column(lookupId, 'lookup')}
LIMIT 5000`,
+ query: `SELECT "k", "v" FROM ${N('lookup').table(lookupId)} LIMIT
5000`,
});
},
initQuery: props.lookupId,
diff --git a/web-console/src/druid-models/external-config/external-config.ts
b/web-console/src/druid-models/external-config/external-config.ts
index d9dcb97cd1..900551741c 100644
--- a/web-console/src/druid-models/external-config/external-config.ts
+++ b/web-console/src/druid-models/external-config/external-config.ts
@@ -17,12 +17,14 @@
*/
import {
+ C,
+ F,
filterMap,
+ L,
SqlExpression,
SqlFunction,
SqlLiteral,
SqlQuery,
- SqlRef,
SqlStar,
} from 'druid-query-toolkit';
import * as JSONBig from 'json-bigint-native';
@@ -120,9 +122,9 @@ export function summarizeExternalConfig(externalConfig:
ExternalConfig): string
export function externalConfigToTableExpression(config: ExternalConfig):
SqlExpression {
return SqlExpression.parse(`TABLE(
EXTERN(
- ${SqlLiteral.create(JSONBig.stringify(config.inputSource))},
- ${SqlLiteral.create(JSONBig.stringify(config.inputFormat))},
- ${SqlLiteral.create(JSONBig.stringify(config.signature))}
+ ${L(JSONBig.stringify(config.inputSource))},
+ ${L(JSONBig.stringify(config.inputFormat))},
+ ${L(JSONBig.stringify(config.signature))}
)
)`);
}
@@ -135,11 +137,8 @@ export function externalConfigToInitDimensions(
return (timeExpression ? [timeExpression.as('__time')] : [])
.concat(
filterMap(config.signature, ({ name }, i) => {
- if (timeExpression && timeExpression.containsColumn(name)) return;
- return SqlRef.column(name).applyIf(
- isArrays[i],
- ex => SqlFunction.simple('MV_TO_ARRAY', [ex]).as(name) as any,
- );
+ if (timeExpression && timeExpression.containsColumnName(name)) return;
+ return C(name).applyIf(isArrays[i], ex => F('MV_TO_ARRAY',
ex).as(name) as any);
}),
)
.slice(0, MULTI_STAGE_QUERY_MAX_COLUMNS);
diff --git
a/web-console/src/druid-models/ingest-query-pattern/ingest-query-pattern.ts
b/web-console/src/druid-models/ingest-query-pattern/ingest-query-pattern.ts
index 53a6f2b6b8..f4dee926b6 100644
--- a/web-console/src/druid-models/ingest-query-pattern/ingest-query-pattern.ts
+++ b/web-console/src/druid-models/ingest-query-pattern/ingest-query-pattern.ts
@@ -23,8 +23,8 @@ import {
SqlPartitionedByClause,
SqlQuery,
SqlReplaceClause,
- SqlTableRef,
SqlWithPart,
+ T,
} from 'druid-query-toolkit';
import { filterMap, oneOf } from '../../utils';
@@ -150,10 +150,10 @@ export function fitIngestQueryPattern(query: SqlQuery):
IngestQueryPattern {
let overwriteWhere: SqlExpression | undefined;
if (query.insertClause) {
mode = 'insert';
- destinationTableName = query.insertClause.table.getTable();
+ destinationTableName = query.insertClause.table.getName();
} else if (query.replaceClause) {
mode = 'replace';
- destinationTableName = query.replaceClause.table.getTable();
+ destinationTableName = query.replaceClause.table.getName();
overwriteWhere = query.replaceClause.whereClause?.expression;
} else {
throw new Error(`Must have an INSERT or REPLACE clause`);
@@ -251,7 +251,7 @@ export function ingestQueryPatternToQuery(
partitionedBy,
clusteredBy,
} = ingestQueryPattern;
- return SqlQuery.from(SqlTableRef.create(mainExternalName))
+ return SqlQuery.from(T(mainExternalName))
.applyIf(!preview, q =>
mode === 'insert'
? q.changeInsertIntoTable(destinationTableName)
diff --git
a/web-console/src/druid-models/workbench-query/workbench-query-part.ts
b/web-console/src/druid-models/workbench-query/workbench-query-part.ts
index d78bd8bbe4..604cfb0132 100644
--- a/web-console/src/druid-models/workbench-query/workbench-query-part.ts
+++ b/web-console/src/druid-models/workbench-query/workbench-query-part.ts
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-import { SqlExpression, SqlQuery, SqlTableRef, SqlValues, SqlWithQuery } from
'druid-query-toolkit';
+import { SqlExpression, SqlQuery, SqlValues, SqlWithQuery, T } from
'druid-query-toolkit';
import Hjson from 'hjson';
import * as JSONBig from 'json-bigint-native';
@@ -71,7 +71,7 @@ export class WorkbenchQueryPart {
);
if (!fragmentQuery) return;
- return fragmentQuery.getIngestTable()?.getTable();
+ return fragmentQuery.getIngestTable()?.getName();
}
public readonly id: string;
@@ -179,7 +179,7 @@ export class WorkbenchQueryPart {
public getIngestDatasource(): string | undefined {
const { queryString, parsedQuery } = this;
if (parsedQuery) {
- return parsedQuery.getIngestTable()?.getTable();
+ return parsedQuery.getIngestTable()?.getName();
}
if (this.isJsonLike()) return;
@@ -241,7 +241,7 @@ export class WorkbenchQueryPart {
public toWithPart(): string {
const { queryName, queryString } = this;
- return `${SqlTableRef.create(queryName || 'q')} AS (\n${queryString}\n)`;
+ return `${T(queryName || 'q')} AS (\n${queryString}\n)`;
}
public duplicate(): WorkbenchQueryPart {
diff --git a/web-console/src/druid-models/workbench-query/workbench-query.ts
b/web-console/src/druid-models/workbench-query/workbench-query.ts
index 2a7f2b2e40..36c71cb07a 100644
--- a/web-console/src/druid-models/workbench-query/workbench-query.ts
+++ b/web-console/src/druid-models/workbench-query/workbench-query.ts
@@ -17,16 +17,16 @@
*/
import {
+ C,
+ F,
SqlClusteredByClause,
SqlExpression,
- SqlFunction,
SqlLiteral,
SqlOrderByClause,
SqlOrderByExpression,
SqlPartitionedByClause,
SqlQuery,
- SqlRef,
- SqlTableRef,
+ SqlTable,
} from 'druid-query-toolkit';
import Hjson from 'hjson';
import * as JSONBig from 'json-bigint-native';
@@ -201,10 +201,7 @@ export class WorkbenchQuery {
let partitionedByExpression = partitionedByClause.expression;
if (partitionedByExpression) {
if (partitionedByExpression instanceof SqlLiteral) {
- partitionedByExpression = SqlFunction.floor(
- SqlRef.column('__time'),
- partitionedByExpression,
- );
+ partitionedByExpression = F.floor(C('__time'),
partitionedByExpression);
}
orderByExpressions.push(SqlOrderByExpression.create(partitionedByExpression));
}
@@ -451,8 +448,8 @@ export class WorkbenchQuery {
const parsedQuery = this.getParsedQuery();
if (parsedQuery) {
const fromExpression = parsedQuery.getFirstFromExpression();
- if (fromExpression instanceof SqlTableRef) {
- const firstTable = fromExpression.getTable();
+ if (fromExpression instanceof SqlTable) {
+ const firstTable = fromExpression.getName();
ret = ret.changeQueryParts(
this.queryParts.map(queryPart =>
queryPart.queryName === firstTable ? queryPart.addPreviewLimit() :
queryPart,
diff --git a/web-console/src/helpers/execution/sql-task-execution.ts
b/web-console/src/helpers/execution/sql-task-execution.ts
index 03e08e6e55..e7f7250c53 100644
--- a/web-console/src/helpers/execution/sql-task-execution.ts
+++ b/web-console/src/helpers/execution/sql-task-execution.ts
@@ -17,7 +17,7 @@
*/
import { AxiosResponse, CancelToken } from 'axios';
-import { SqlLiteral } from 'druid-query-toolkit';
+import { L } from 'druid-query-toolkit';
import { Execution, QueryContext } from '../../druid-models';
import { Api } from '../../singletons';
@@ -227,7 +227,7 @@ export async function
updateExecutionWithDatasourceExistsIfNeeded(
COUNT(*) AS num_segments,
COUNT(*) FILTER (WHERE is_published = 1 AND is_available = 0) AS
loading_segments
FROM sys.segments
-WHERE datasource = ${SqlLiteral.create(execution.destination.dataSource)} AND
is_overshadowed = 0`,
+WHERE datasource = ${L(execution.destination.dataSource)} AND is_overshadowed
= 0`,
});
const numSegments: number = deepGet(segmentCheck, '0.num_segments') || 0;
diff --git a/web-console/src/helpers/spec-conversion.ts
b/web-console/src/helpers/spec-conversion.ts
index 76bdc16a92..d35433917f 100644
--- a/web-console/src/helpers/spec-conversion.ts
+++ b/web-console/src/helpers/spec-conversion.ts
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-import { RefName, SqlExpression, SqlLiteral, SqlRef, SqlTableRef } from
'druid-query-toolkit';
+import { C, L, RefName, SqlExpression, T } from 'druid-query-toolkit';
import * as JSONBig from 'json-bigint-native';
import {
@@ -38,10 +38,10 @@ export function getSpecDatasourceName(spec: IngestionSpec):
string {
function convertFilter(filter: any): SqlExpression {
switch (filter.type) {
case 'selector':
- return SqlRef.column(filter.dimension).equal(filter.value);
+ return C(filter.dimension).equal(filter.value);
case 'in':
- return SqlRef.column(filter.dimension).in(filter.values);
+ return C(filter.dimension).in(filter.values);
case 'not':
return convertFilter(filter.field).not();
@@ -57,7 +57,7 @@ function convertFilter(filter: any): SqlExpression {
}
}
-const SOURCE_REF = SqlTableRef.create('source');
+const SOURCE_TABLE = T('source');
export function convertSpecToSql(spec: any): QueryWithContext {
if (!oneOf(spec.type, 'index_parallel', 'index', 'index_hadoop')) {
@@ -108,8 +108,8 @@ export function convertSpecToSql(spec: any):
QueryWithContext {
}
let timeExpression: string;
- const column = timestampSpec.column || 'timestamp';
- const columnRef = SqlRef.column(column);
+ const timestampColumnName = timestampSpec.column || 'timestamp';
+ const timestampColumn = C(timestampColumnName);
const format = timestampSpec.format || 'auto';
const timeTransform = transforms.find(t => t.name === '__time');
if (timeTransform) {
@@ -117,46 +117,44 @@ export function convertSpecToSql(spec: any):
QueryWithContext {
} else {
switch (format) {
case 'auto':
- columns.unshift({ name: column, type: 'string' });
- timeExpression = `CASE WHEN CAST(${columnRef} AS BIGINT) > 0 THEN
MILLIS_TO_TIMESTAMP(CAST(${columnRef} AS BIGINT)) ELSE TIME_PARSE(${columnRef})
END`;
+ columns.unshift({ name: timestampColumnName, type: 'string' });
+ timeExpression = `CASE WHEN CAST(${timestampColumn} AS BIGINT) > 0
THEN MILLIS_TO_TIMESTAMP(CAST(${timestampColumn} AS BIGINT)) ELSE
TIME_PARSE(${timestampColumn}) END`;
break;
case 'iso':
- columns.unshift({ name: column, type: 'string' });
- timeExpression = `TIME_PARSE(${columnRef})`;
+ columns.unshift({ name: timestampColumnName, type: 'string' });
+ timeExpression = `TIME_PARSE(${timestampColumn})`;
break;
case 'posix':
- columns.unshift({ name: column, type: 'long' });
- timeExpression = `MILLIS_TO_TIMESTAMP(${columnRef} * 1000)`;
+ columns.unshift({ name: timestampColumnName, type: 'long' });
+ timeExpression = `MILLIS_TO_TIMESTAMP(${timestampColumn} * 1000)`;
break;
case 'millis':
- columns.unshift({ name: column, type: 'long' });
- timeExpression = `MILLIS_TO_TIMESTAMP(${columnRef})`;
+ columns.unshift({ name: timestampColumnName, type: 'long' });
+ timeExpression = `MILLIS_TO_TIMESTAMP(${timestampColumn})`;
break;
case 'micro':
- columns.unshift({ name: column, type: 'long' });
- timeExpression = `MILLIS_TO_TIMESTAMP(${columnRef} / 1000)`;
+ columns.unshift({ name: timestampColumnName, type: 'long' });
+ timeExpression = `MILLIS_TO_TIMESTAMP(${timestampColumn} / 1000)`;
break;
case 'nano':
- columns.unshift({ name: column, type: 'long' });
- timeExpression = `MILLIS_TO_TIMESTAMP(${columnRef} / 1000000)`;
+ columns.unshift({ name: timestampColumnName, type: 'long' });
+ timeExpression = `MILLIS_TO_TIMESTAMP(${timestampColumn} / 1000000)`;
break;
default:
- columns.unshift({ name: column, type: 'string' });
- timeExpression = `TIME_PARSE(${columnRef},
${SqlLiteral.create(format)})`;
+ columns.unshift({ name: timestampColumnName, type: 'string' });
+ timeExpression = `TIME_PARSE(${timestampColumn}, ${L(format)})`;
break;
}
}
if (timestampSpec.missingValue) {
- timeExpression = `COALESCE(${timeExpression},
TIME_PARSE(${SqlLiteral.create(
- timestampSpec.missingValue,
- )}))`;
+ timeExpression = `COALESCE(${timeExpression},
TIME_PARSE(${L(timestampSpec.missingValue)}))`;
}
timeExpression = convertQueryGranularity(
@@ -180,17 +178,17 @@ export function convertSpecToSql(spec: any):
QueryWithContext {
if (typeof dataSource !== 'string') throw new
Error(`spec.dataSchema.dataSource is not a string`);
if (deepGet(spec, 'spec.ioConfig.appendToExisting')) {
- lines.push(`INSERT INTO ${SqlTableRef.create(dataSource)}`);
+ lines.push(`INSERT INTO ${T(dataSource)}`);
} else {
const overwrite = deepGet(spec, 'spec.ioConfig.dropExisting')
? 'WHERE ' +
- SqlExpression.fromTimeRefAndInterval(
- SqlRef.column('__time'),
+ SqlExpression.fromTimeExpressionAndInterval(
+ C('__time'),
deepGet(spec, 'spec.dataSchema.granularitySpec.intervals'),
)
: 'ALL';
- lines.push(`REPLACE INTO ${SqlTableRef.create(dataSource)} OVERWRITE
${overwrite}`);
+ lines.push(`REPLACE INTO ${T(dataSource)} OVERWRITE ${overwrite}`);
}
let inputSource: any;
@@ -220,27 +218,24 @@ export function convertSpecToSql(spec: any):
QueryWithContext {
if (inputSource.type === 'druid') {
lines.push(
- `WITH ${SOURCE_REF} AS (`,
+ `WITH ${SOURCE_TABLE} AS (`,
` SELECT *`,
- ` FROM ${SqlTableRef.create(inputSource.dataSource)}`,
- ` WHERE ${SqlExpression.fromTimeRefAndInterval(
- SqlRef.column('__time'),
- inputSource.interval,
- )}`,
+ ` FROM ${T(inputSource.dataSource)}`,
+ ` WHERE ${SqlExpression.fromTimeExpressionAndInterval(C('__time'),
inputSource.interval)}`,
')',
);
} else {
lines.push(
- `WITH ${SOURCE_REF} AS (SELECT * FROM TABLE(`,
+ `WITH ${SOURCE_TABLE} AS (SELECT * FROM TABLE(`,
` EXTERN(`,
- ` ${SqlLiteral.create(JSONBig.stringify(inputSource))},`,
+ ` ${L(JSONBig.stringify(inputSource))},`,
);
const inputFormat = deepGet(spec, 'spec.ioConfig.inputFormat');
if (!inputFormat) throw new Error(`spec.ioConfig.inputFormat is not
defined`);
lines.push(
- ` ${SqlLiteral.create(JSONBig.stringify(inputFormat))},`,
- ` ${SqlLiteral.create(JSONBig.stringify(columns))}`,
+ ` ${L(JSONBig.stringify(inputFormat))},`,
+ ` ${L(JSONBig.stringify(columns))}`,
` )`,
`))`,
);
@@ -264,7 +259,7 @@ export function convertSpecToSql(spec: any):
QueryWithContext {
const relevantTransform = transforms.find(t => t.name === dimensionName);
return ` ${
relevantTransform ? `REWRITE_[${relevantTransform.expression}]_TO_SQL
AS ` : ''
- }${SqlRef.column(dimensionName)},${
+ }${C(dimensionName)},${
relevantTransform ? ` --:ISSUE: Transform for dimension could not be
converted` : ''
}`;
}),
@@ -282,7 +277,7 @@ export function convertSpecToSql(spec: any):
QueryWithContext {
.replace(/,(\s+--)/, '$1');
lines.push(selectExpressions.join('\n'));
- lines.push(`FROM ${SOURCE_REF}`);
+ lines.push(`FROM ${SOURCE_TABLE}`);
const filter = deepGet(spec, 'spec.dataSchema.transformSpec.filter');
if (filter) {
@@ -316,7 +311,7 @@ export function convertSpecToSql(spec: any):
QueryWithContext {
partitionsSpec.partitionDimensions ||
(partitionsSpec.partitionDimension ? [partitionsSpec.partitionDimension] :
undefined);
if (Array.isArray(partitionDimensions)) {
- lines.push(`CLUSTERED BY ${partitionDimensions.map(d =>
SqlRef.column(d)).join(', ')}`);
+ lines.push(`CLUSTERED BY ${partitionDimensions.map(d => C(d)).join(',
')}`);
}
return {
@@ -397,56 +392,56 @@ function metricSpecToSqlExpression(metricSpec:
MetricSpec): string | undefined {
}
if (!metricSpec.fieldName) return;
- const ref = SqlRef.column(metricSpec.fieldName);
+ const column = C(metricSpec.fieldName);
switch (metricSpec.type) {
case 'longSum':
case 'floatSum':
case 'doubleSum':
- return `SUM(${ref})`;
+ return `SUM(${column})`;
case 'longMin':
case 'floatMin':
case 'doubleMin':
- return `MIN(${ref})`;
+ return `MIN(${column})`;
case 'longMax':
case 'floatMax':
case 'doubleMax':
- return `MAX(${ref})`;
+ return `MAX(${column})`;
case 'doubleFirst':
case 'floatFirst':
case 'longFirst':
- return `EARLIEST(${ref})`;
+ return `EARLIEST(${column})`;
case 'stringFirst':
- return `EARLIEST(${ref}, ${SqlLiteral.create(metricSpec.maxStringBytes
|| 128)})`;
+ return `EARLIEST(${column}, ${L(metricSpec.maxStringBytes || 128)})`;
case 'doubleLast':
case 'floatLast':
case 'longLast':
- return `LATEST(${ref})`;
+ return `LATEST(${column})`;
case 'stringLast':
- return `LATEST(${ref}, ${SqlLiteral.create(metricSpec.maxStringBytes ||
128)})`;
+ return `LATEST(${column}, ${L(metricSpec.maxStringBytes || 128)})`;
case 'thetaSketch':
- return
`APPROX_COUNT_DISTINCT_DS_THETA(${ref}${extraArgs([metricSpec.size, 16384])})`;
+ return
`APPROX_COUNT_DISTINCT_DS_THETA(${column}${extraArgs([metricSpec.size,
16384])})`;
case 'HLLSketchBuild':
case 'HLLSketchMerge':
- return `APPROX_COUNT_DISTINCT_DS_HLL(${ref}${extraArgs(
+ return `APPROX_COUNT_DISTINCT_DS_HLL(${column}${extraArgs(
[metricSpec.lgK, 12],
[metricSpec.tgtHllType, 'HLL_4'],
)})`;
case 'quantilesDoublesSketch':
// For consistency with the above this should be APPROX_QUANTILE_DS but
that requires a post agg so it does not work quite right.
- return `DS_QUANTILES_SKETCH(${ref}${extraArgs([metricSpec.k, 128])})`;
+ return `DS_QUANTILES_SKETCH(${column}${extraArgs([metricSpec.k, 128])})`;
case 'hyperUnique':
- return `APPROX_COUNT_DISTINCT_BUILTIN(${ref})`;
+ return `APPROX_COUNT_DISTINCT_BUILTIN(${column})`;
default:
// The following things are (knowingly) not supported:
@@ -464,5 +459,5 @@ function extraArgs(...thingAndDefaults: [any, any?][]):
string {
}
if (!thingAndDefaults.length) return '';
- return ', ' + thingAndDefaults.map(([x, def]) => SqlLiteral.create(x ??
def)).join(', ');
+ return ', ' + thingAndDefaults.map(([x, def]) => L(x ?? def)).join(', ');
}
diff --git a/web-console/src/react-table/react-table-utils.ts
b/web-console/src/react-table/react-table-utils.ts
index 2563ceffd3..a87a733046 100644
--- a/web-console/src/react-table/react-table-utils.ts
+++ b/web-console/src/react-table/react-table-utils.ts
@@ -18,7 +18,7 @@
import { IconName } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
-import { SqlExpression, SqlFunction, SqlLiteral, SqlRef } from
'druid-query-toolkit';
+import { C, F, SqlExpression } from 'druid-query-toolkit';
import { Filter } from 'react-table';
import { addOrUpdate, caseInsensitiveContains } from '../utils';
@@ -142,24 +142,21 @@ export function sqlQueryCustomTableFilter(filter:
Filter): SqlExpression | undef
const modeAndNeedle = parseFilterModeAndNeedle(filter);
if (!modeAndNeedle) return;
const { mode, needle } = modeAndNeedle;
- const column = SqlRef.column(filter.id);
- const needleLiteral = SqlLiteral.create(needle);
+ const column = C(filter.id);
switch (mode) {
case '=':
- return column.equal(needleLiteral);
+ return column.equal(needle);
case '!=':
- return column.unequal(needleLiteral);
+ return column.unequal(needle);
case '<=':
- return column.lessThanOrEqual(needleLiteral);
+ return column.lessThanOrEqual(needle);
case '>=':
- return column.greaterThanOrEqual(needleLiteral);
+ return column.greaterThanOrEqual(needle);
default:
- return SqlFunction.simple('LOWER', [column]).like(
- SqlLiteral.create(`%${needle.toLowerCase()}%`),
- );
+ return F('LOWER', column).like(`%${needle.toLowerCase()}%`);
}
}
diff --git a/web-console/src/utils/druid-query.ts
b/web-console/src/utils/druid-query.ts
index 2253d4d6b3..668d4703cf 100644
--- a/web-console/src/utils/druid-query.ts
+++ b/web-console/src/utils/druid-query.ts
@@ -17,7 +17,7 @@
*/
import axios, { AxiosResponse } from 'axios';
-import { SqlRef } from 'druid-query-toolkit';
+import { C } from 'druid-query-toolkit';
import { Api } from '../singletons';
@@ -309,6 +309,6 @@ export interface QueryExplanation {
export function formatSignature(queryExplanation: QueryExplanation): string {
return queryExplanation.signature
- .map(({ name, type }) => `${SqlRef.columnWithoutQuotes(name)}::${type}`)
+ .map(({ name, type }) => `${C.optionalQuotes(name)}::${type}`)
.join(', ');
}
diff --git a/web-console/src/utils/query-cursor.ts
b/web-console/src/utils/query-cursor.ts
index c7a4a42235..a881b515c4 100644
--- a/web-console/src/utils/query-cursor.ts
+++ b/web-console/src/utils/query-cursor.ts
@@ -16,12 +16,12 @@
* limitations under the License.
*/
-import { SqlBase, SqlLiteral, SqlQuery } from 'druid-query-toolkit';
+import { L, SqlBase, SqlQuery } from 'druid-query-toolkit';
-export const EMPTY_LITERAL = SqlLiteral.create('');
+export const EMPTY_LITERAL = L('');
const CRAZY_STRING = '[email protected].$';
-const DOT_DOT_DOT_LITERAL = SqlLiteral.create('...');
+const DOT_DOT_DOT_LITERAL = L('...');
export function prettyPrintSql(b: SqlBase): string {
return b
@@ -44,14 +44,7 @@ export interface RowColumn {
}
export function findEmptyLiteralPosition(query: SqlQuery): RowColumn |
undefined {
- const subQueryString = query
- .walk(b => {
- if (b === EMPTY_LITERAL) {
- return SqlLiteral.create(CRAZY_STRING);
- }
- return b;
- })
- .toString();
+ const subQueryString = query.walk(b => (b === EMPTY_LITERAL ?
L(CRAZY_STRING) : b)).toString();
const crazyIndex = subQueryString.indexOf(CRAZY_STRING);
if (crazyIndex < 0) return;
diff --git a/web-console/src/utils/sample-query.tsx
b/web-console/src/utils/sample-query.tsx
index 01f4f2d43d..25765435e0 100644
--- a/web-console/src/utils/sample-query.tsx
+++ b/web-console/src/utils/sample-query.tsx
@@ -17,18 +17,18 @@
*/
import {
+ C,
Column,
+ F,
+ L,
LiteralValue,
QueryResult,
RefName,
SqlAlias,
SqlColumnList,
SqlExpression,
- SqlFunction,
- SqlLiteral,
SqlQuery,
SqlRecord,
- SqlRef,
SqlValues,
} from 'druid-query-toolkit';
@@ -50,13 +50,13 @@ export function sampleDataToQuery(sample: QueryResult):
SqlQuery {
SqlRecord.create(
row.map((r, i) => {
if (header[i].nativeType === 'COMPLEX<json>') {
- return SqlLiteral.create(JSON.stringify(r));
+ return L(JSON.stringify(r));
} else if (Array.isArray(r)) {
arrayIndexes[i] = true;
- return SqlLiteral.create(r.join(SAMPLE_ARRAY_SEPARATOR));
+ return L(r.join(SAMPLE_ARRAY_SEPARATOR));
} else {
- // Avoid actually using NULL literals as they create havc in
the VALUES type system and throw errors.
- return SqlLiteral.create(r == null ? nullForColumn(header[i])
: r);
+ // Avoid actually using NULL literals as they create havoc in
the VALUES type system and throw errors.
+ return L(r == null ? nullForColumn(header[i]) : r);
}
}),
),
@@ -67,11 +67,11 @@ export function sampleDataToQuery(sample: QueryResult):
SqlQuery {
}),
).changeSelectExpressions(
header.map((h, i) => {
- let ex: SqlExpression = SqlRef.column(`c${i}`);
+ let ex: SqlExpression = C(`c${i}`);
if (h.nativeType === 'COMPLEX<json>') {
- ex = SqlFunction.simple('PARSE_JSON', [ex]);
+ ex = F('PARSE_JSON', ex);
} else if (arrayIndexes[i]) {
- ex = SqlFunction.simple('STRING_TO_MV', [ex,
SqlLiteral.create(SAMPLE_ARRAY_SEPARATOR)]);
+ ex = F('STRING_TO_MV', ex, SAMPLE_ARRAY_SEPARATOR);
} else if (h.sqlType) {
ex = ex.cast(h.sqlType);
}
diff --git a/web-console/src/utils/sql.ts b/web-console/src/utils/sql.ts
index a98a0c2686..4e63f4a23c 100644
--- a/web-console/src/utils/sql.ts
+++ b/web-console/src/utils/sql.ts
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-import { SqlExpression, SqlFunction, SqlLiteral, SqlRef, SqlStar } from
'druid-query-toolkit';
+import { SqlColumn, SqlExpression, SqlFunction, SqlLiteral, SqlStar } from
'druid-query-toolkit';
export function timeFormatToSql(timeFormat: string): SqlExpression | undefined
{
switch (timeFormat) {
@@ -54,7 +54,7 @@ export function convertToGroupByExpression(ex:
SqlExpression): SqlExpression | u
if (interestingArgs.length !== 1) return;
const newEx = interestingArgs[0];
- if (newEx instanceof SqlRef) return newEx;
+ if (newEx instanceof SqlColumn) return newEx;
return newEx.as((ex.getOutputName() || 'grouped').replace(/^[a-z]+_/i, ''));
}
diff --git a/web-console/src/views/datasources-view/datasources-view.tsx
b/web-console/src/views/datasources-view/datasources-view.tsx
index b368fccf9e..7f384fc8bc 100644
--- a/web-console/src/views/datasources-view/datasources-view.tsx
+++ b/web-console/src/views/datasources-view/datasources-view.tsx
@@ -19,7 +19,7 @@
import { FormGroup, InputGroup, Intent, MenuItem, Switch } from
'@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
import classNames from 'classnames';
-import { SqlQuery, SqlTableRef } from 'druid-query-toolkit';
+import { SqlQuery, T } from 'druid-query-toolkit';
import React from 'react';
import ReactTable, { Filter } from 'react-table';
@@ -830,8 +830,7 @@ ORDER BY 1`;
goToActions.push({
icon: IconNames.APPLICATION,
title: 'Query with SQL',
- onAction: () =>
- goToQuery({ queryString:
SqlQuery.create(SqlTableRef.create(datasource)).toString() }),
+ onAction: () => goToQuery({ queryString:
SqlQuery.create(T(datasource)).toString() }),
});
}
diff --git a/web-console/src/views/segments-view/segments-view.tsx
b/web-console/src/views/segments-view/segments-view.tsx
index 4f9ee21a29..8b5842bd85 100644
--- a/web-console/src/views/segments-view/segments-view.tsx
+++ b/web-console/src/views/segments-view/segments-view.tsx
@@ -19,7 +19,7 @@
import { Button, ButtonGroup, Intent, Label, MenuItem, Switch } from
'@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
import classNames from 'classnames';
-import { SqlComparison, SqlExpression, SqlLiteral, SqlRef } from
'druid-query-toolkit';
+import { C, L, SqlComparison, SqlExpression } from 'druid-query-toolkit';
import * as JSONBig from 'json-bigint-native';
import React from 'react';
import ReactTable, { Filter } from 'react-table';
@@ -125,7 +125,7 @@ const tableColumns: Record<CapabilitiesMode, string[]> = {
};
function formatRangeDimensionValue(dimension: any, value: any): string {
- return
`${SqlRef.column(String(dimension))}=${SqlLiteral.create(String(value))}`;
+ return `${C(String(dimension))}=${L(String(value))}`;
}
export interface SegmentsViewProps {
@@ -281,20 +281,23 @@ END AS "time_span"`,
// Creates filters like `shard_spec LIKE '%"type":"numbered"%'`
const modeAndNeedle = parseFilterModeAndNeedle(f);
if (!modeAndNeedle) return;
- const shardSpecRef = SqlRef.column('shard_spec');
+ const shardSpecColumn = C('shard_spec');
switch (modeAndNeedle.mode) {
case '=':
- return SqlComparison.like(shardSpecRef,
`%"type":"${modeAndNeedle.needle}"%`);
+ return SqlComparison.like(shardSpecColumn,
`%"type":"${modeAndNeedle.needle}"%`);
case '!=':
- return SqlComparison.notLike(shardSpecRef,
`%"type":"${modeAndNeedle.needle}"%`);
+ return SqlComparison.notLike(
+ shardSpecColumn,
+ `%"type":"${modeAndNeedle.needle}"%`,
+ );
default:
- return SqlComparison.like(shardSpecRef,
`%"type":"${modeAndNeedle.needle}%`);
+ return SqlComparison.like(shardSpecColumn,
`%"type":"${modeAndNeedle.needle}%`);
}
} else if (f.id.startsWith('is_')) {
if (f.value === 'all') return;
- return SqlRef.column(f.id).equal(f.value === 'true' ? 1 : 0);
+ return C(f.id).equal(f.value === 'true' ? 1 : 0);
} else {
return sqlQueryCustomTableFilter(f);
}
@@ -335,7 +338,7 @@ END AS "time_span"`,
queryParts.push(
'ORDER BY ' +
sorted
- .map((sort: any) => `${SqlRef.column(sort.id)} ${sort.desc
? 'DESC' : 'ASC'}`)
+ .map((sort: any) => `${C(sort.id)} ${sort.desc ? 'DESC' :
'ASC'}`)
.join(', '),
);
}
@@ -352,7 +355,7 @@ END AS "time_span"`,
queryParts.push(
'ORDER BY ' +
sorted
- .map((sort: any) => `${SqlRef.column(sort.id)} ${sort.desc
? 'DESC' : 'ASC'}`)
+ .map((sort: any) => `${C(sort.id)} ${sort.desc ? 'DESC' :
'ASC'}`)
.join(', '),
);
}
diff --git
a/web-console/src/views/sql-data-loader-view/column-actions/column-actions.tsx
b/web-console/src/views/sql-data-loader-view/column-actions/column-actions.tsx
index c0c198f26d..363a6e290b 100644
---
a/web-console/src/views/sql-data-loader-view/column-actions/column-actions.tsx
+++
b/web-console/src/views/sql-data-loader-view/column-actions/column-actions.tsx
@@ -19,7 +19,7 @@
import { Button, FormGroup, Menu, MenuItem } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
import { Popover2 } from '@blueprintjs/popover2';
-import { QueryResult, SqlExpression, SqlFunction } from 'druid-query-toolkit';
+import { F, QueryResult, SqlExpression } from 'druid-query-toolkit';
import React from 'react';
import { possibleDruidFormatForValues, TIME_COLUMN } from
'../../../druid-models';
@@ -49,7 +49,7 @@ export const ColumnActions = React.memo(function
ExpressionEditor(props: ColumnA
const expression =
queryResult.sqlQuery?.getSelectExpressionForIndex(headerIndex);
- if (sqlQuery.getEffectiveWhereExpression().containsColumn(header)) {
+ if (sqlQuery.getEffectiveWhereExpression().containsColumnName(header)) {
removeFilterButton = (
<Button
icon={IconNames.FILTER_REMOVE}
@@ -147,7 +147,6 @@ export const ColumnActions = React.memo(function
ExpressionEditor(props: ColumnA
};
const underlyingSelectExpression =
expression.getUnderlyingExpression();
-
convertButton = (
<Popover2
content={
@@ -159,9 +158,7 @@ export const ColumnActions = React.memo(function
ExpressionEditor(props: ColumnA
text="Convert to SUM(...)"
onClick={() => {
convertToAggregate([
- SqlFunction.simple('SUM',
[underlyingSelectExpression]).as(
- `sum_${header}`,
- ),
+ F('SUM',
underlyingSelectExpression).as(`sum_${header}`),
]);
}}
/>
@@ -169,9 +166,7 @@ export const ColumnActions = React.memo(function
ExpressionEditor(props: ColumnA
text="Convert to MIN(...)"
onClick={() => {
convertToAggregate([
- SqlFunction.simple('MIN',
[underlyingSelectExpression]).as(
- `min_${header}`,
- ),
+ F('MIN',
underlyingSelectExpression).as(`min_${header}`),
]);
}}
/>
@@ -179,9 +174,7 @@ export const ColumnActions = React.memo(function
ExpressionEditor(props: ColumnA
text="Convert to MAX(...)"
onClick={() => {
convertToAggregate([
- SqlFunction.simple('MAX',
[underlyingSelectExpression]).as(
- `max_${header}`,
- ),
+ F('MAX',
underlyingSelectExpression).as(`max_${header}`),
]);
}}
/>
@@ -189,15 +182,9 @@ export const ColumnActions = React.memo(function
ExpressionEditor(props: ColumnA
text="Convert to SUM(...), MIN(...), and MAX(...)"
onClick={() => {
convertToAggregate([
- SqlFunction.simple('SUM',
[underlyingSelectExpression]).as(
- `sum_${header}`,
- ),
- SqlFunction.simple('MIN',
[underlyingSelectExpression]).as(
- `min_${header}`,
- ),
- SqlFunction.simple('MAX',
[underlyingSelectExpression]).as(
- `max_${header}`,
- ),
+ F('SUM',
underlyingSelectExpression).as(`sum_${header}`),
+ F('MIN',
underlyingSelectExpression).as(`min_${header}`),
+ F('MAX',
underlyingSelectExpression).as(`max_${header}`),
]);
}}
/>
@@ -207,9 +194,9 @@ export const ColumnActions = React.memo(function
ExpressionEditor(props: ColumnA
text="Convert to APPROX_COUNT_DISTINCT_DS_HLL(...)"
onClick={() => {
convertToAggregate([
- SqlFunction.simple('APPROX_COUNT_DISTINCT_DS_HLL',
[
- underlyingSelectExpression,
- ]).as(`unique_${header}`),
+ F('APPROX_COUNT_DISTINCT_DS_HLL',
underlyingSelectExpression).as(
+ `unique_${header}`,
+ ),
]);
}}
/>
@@ -217,9 +204,9 @@ export const ColumnActions = React.memo(function
ExpressionEditor(props: ColumnA
text="Convert to APPROX_COUNT_DISTINCT_DS_THETA(...)"
onClick={() => {
convertToAggregate([
-
SqlFunction.simple('APPROX_COUNT_DISTINCT_DS_THETA', [
- underlyingSelectExpression,
- ]).as(`unique_${header}`),
+ F('APPROX_COUNT_DISTINCT_DS_THETA',
underlyingSelectExpression).as(
+ `unique_${header}`,
+ ),
]);
}}
/>
@@ -227,9 +214,9 @@ export const ColumnActions = React.memo(function
ExpressionEditor(props: ColumnA
text="Convert to APPROX_COUNT_DISTINCT_BUILTIN(...)"
onClick={() => {
convertToAggregate([
-
SqlFunction.simple('APPROX_COUNT_DISTINCT_BUILTIN', [
- underlyingSelectExpression,
- ]).as(`unique_${header}`),
+ F('APPROX_COUNT_DISTINCT_BUILTIN',
underlyingSelectExpression).as(
+ `unique_${header}`,
+ ),
]);
}}
/>
diff --git
a/web-console/src/views/sql-data-loader-view/ingestion-progress-dialog/ingestion-progress-dialog.tsx
b/web-console/src/views/sql-data-loader-view/ingestion-progress-dialog/ingestion-progress-dialog.tsx
index 69dcd79918..3e911096c7 100644
---
a/web-console/src/views/sql-data-loader-view/ingestion-progress-dialog/ingestion-progress-dialog.tsx
+++
b/web-console/src/views/sql-data-loader-view/ingestion-progress-dialog/ingestion-progress-dialog.tsx
@@ -19,7 +19,7 @@
import { Button, Classes, Dialog, Intent } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
import classNames from 'classnames';
-import { SqlTableRef } from 'druid-query-toolkit';
+import { T } from 'druid-query-toolkit';
import React, { useState } from 'react';
import { Execution, QueryWithContext } from '../../../druid-models';
@@ -117,7 +117,7 @@ export const IngestionProgressDialog = React.memo(function
IngestionProgressDial
onClick={() => {
if (!insertResultState.data) return;
goToQuery({
- queryString: `SELECT * FROM ${SqlTableRef.create(
+ queryString: `SELECT * FROM ${T(
insertResultState.data.getIngestDatasource()!,
)}`,
});
diff --git
a/web-console/src/views/sql-data-loader-view/schema-step/column-list/expression-entry/expression-entry.tsx
b/web-console/src/views/sql-data-loader-view/schema-step/column-list/expression-entry/expression-entry.tsx
index eca01b3988..3a50976cc5 100644
---
a/web-console/src/views/sql-data-loader-view/schema-step/column-list/expression-entry/expression-entry.tsx
+++
b/web-console/src/views/sql-data-loader-view/schema-step/column-list/expression-entry/expression-entry.tsx
@@ -18,7 +18,7 @@
import { Icon } from '@blueprintjs/core';
import classNames from 'classnames';
-import { Column, QueryResult, SqlRef } from 'druid-query-toolkit';
+import { Column, QueryResult, SqlColumn } from 'druid-query-toolkit';
import React from 'react';
import { columnToIcon } from '../../../../../utils';
@@ -60,7 +60,7 @@ export const ExpressionEntry = function
ExpressionEntry(props: ExpressionEntryPr
{expression.getOutputName() || 'EXPR?'}
<span className="type-name">{` :: ${column.nativeType}`}</span>
</div>
- {!(expression instanceof SqlRef) && (
+ {!(expression instanceof SqlColumn) && (
<div className="expression">
{expression.getUnderlyingExpression().prettify({ keywordCasing:
'preserve' }).toString()}
</div>
diff --git
a/web-console/src/views/sql-data-loader-view/schema-step/preview-table/preview-table.tsx
b/web-console/src/views/sql-data-loader-view/schema-step/preview-table/preview-table.tsx
index 8744e16f89..aab5d9e4c9 100644
---
a/web-console/src/views/sql-data-loader-view/schema-step/preview-table/preview-table.tsx
+++
b/web-console/src/views/sql-data-loader-view/schema-step/preview-table/preview-table.tsx
@@ -76,8 +76,8 @@ export const PreviewTable = React.memo(function
PreviewTable(props: PreviewTable
if (!parsedQuery ||
!parsedQuery.isRealOutputColumnAtSelectIndex(headerIndex)) return false;
return (
- parsedQuery.getEffectiveWhereExpression().containsColumn(header) ||
- parsedQuery.getEffectiveHavingExpression().containsColumn(header)
+ parsedQuery.getEffectiveWhereExpression().containsColumnName(header) ||
+ parsedQuery.getEffectiveHavingExpression().containsColumnName(header)
);
}
diff --git
a/web-console/src/views/sql-data-loader-view/schema-step/rollup-analysis-pane/rollup-analysis-pane.tsx
b/web-console/src/views/sql-data-loader-view/schema-step/rollup-analysis-pane/rollup-analysis-pane.tsx
index a53eff6495..f6112b26b8 100644
---
a/web-console/src/views/sql-data-loader-view/schema-step/rollup-analysis-pane/rollup-analysis-pane.tsx
+++
b/web-console/src/views/sql-data-loader-view/schema-step/rollup-analysis-pane/rollup-analysis-pane.tsx
@@ -19,7 +19,7 @@
import { Button, Callout, Intent, Tag } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
import { CancelToken } from 'axios';
-import { QueryResult, SqlExpression, SqlFunction, SqlQuery } from
'druid-query-toolkit';
+import { F, QueryResult, SqlExpression, SqlFunction, SqlQuery } from
'druid-query-toolkit';
import React, { useEffect } from 'react';
import { Execution } from '../../../../druid-models';
@@ -47,8 +47,8 @@ function expressionCastToString(ex: SqlExpression):
SqlExpression {
return CAST_AS_VARCHAR_TEMPLATE.fillPlaceholders([ex]);
}
-function countDistinct(ex: SqlExpression): SqlExpression {
- return SqlFunction.simple('APPROX_COUNT_DISTINCT_DS_HLL', [ex]);
+function approxCountDistinct(ex: SqlExpression): SqlExpression {
+ return F('APPROX_COUNT_DISTINCT_DS_HLL', ex);
}
function within(a: number, b: number, percent: number): boolean {
@@ -159,13 +159,13 @@ export const RollupAnalysisPane = React.memo(function
RollupAnalysisPane(
const expressionPairs: SqlExpression[] = deep
? pairs(expressions.length).map(([i, j]) =>
- countDistinct(SqlFunction.simple('CONCAT', [groupedAsStrings[i],
groupedAsStrings[j]])),
+ approxCountDistinct(F('CONCAT', groupedAsStrings[i],
groupedAsStrings[j])),
)
: [];
const queryString = seedQuery
-
.changeSelectExpressions(groupedAsStrings.map(countDistinct).concat(expressionPairs))
- .addSelect(countDistinct(SqlFunction.simple('CONCAT',
groupedAsStrings)), {
+
.changeSelectExpressions(groupedAsStrings.map(approxCountDistinct).concat(expressionPairs))
+ .addSelect(approxCountDistinct(SqlFunction.simple('CONCAT',
groupedAsStrings)), {
insertIndex: 0,
})
.addSelect(SqlFunction.COUNT_STAR, { insertIndex: 0 })
diff --git
a/web-console/src/views/sql-data-loader-view/schema-step/schema-step.tsx
b/web-console/src/views/sql-data-loader-view/schema-step/schema-step.tsx
index 489c2f393e..d58e892cb0 100644
--- a/web-console/src/views/sql-data-loader-view/schema-step/schema-step.tsx
+++ b/web-console/src/views/sql-data-loader-view/schema-step/schema-step.tsx
@@ -32,14 +32,7 @@ import { IconNames } from '@blueprintjs/icons';
import { Popover2 } from '@blueprintjs/popover2';
import classNames from 'classnames';
import { select, selectAll } from 'd3-selection';
-import {
- QueryResult,
- QueryRunner,
- SqlExpression,
- SqlFunction,
- SqlQuery,
- SqlRef,
-} from 'druid-query-toolkit';
+import { C, F, QueryResult, QueryRunner, SqlExpression, SqlQuery } from
'druid-query-toolkit';
import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef,
useState } from 'react';
import { ClearableInput, LearnMore, Loader } from '../../../components';
@@ -361,10 +354,9 @@ export const SchemaStep = function SchemaStep(props:
SchemaStepProps) {
...ingestQueryPattern,
dimensions: without(ingestQueryPattern.dimensions, countExpression),
metrics: [
- (countExpression
- ? SqlFunction.simple('SUM',
[countExpression.getUnderlyingExpression()])
- : SqlFunction.COUNT_STAR
- ).as(countExpression?.getOutputName() || 'count'),
+ (countExpression ? F.sum(countExpression.getUnderlyingExpression())
: F.count()).as(
+ countExpression?.getOutputName() || 'count',
+ ),
],
});
}
@@ -460,8 +452,8 @@ export const SchemaStep = function SchemaStep(props:
SchemaStepProps) {
const unusedColumns = ingestQueryPattern
? ingestQueryPattern.mainExternalConfig.signature.filter(
({ name }) =>
- !ingestQueryPattern.dimensions.some(d => d.containsColumn(name)) &&
- !ingestQueryPattern.metrics?.some(m => m.containsColumn(name)),
+ !ingestQueryPattern.dimensions.some(d => d.containsColumnName(name))
&&
+ !ingestQueryPattern.metrics?.some(m => m.containsColumnName(name)),
)
: [];
@@ -714,7 +706,7 @@ export const SchemaStep = function SchemaStep(props:
SchemaStepProps) {
onClick={() => {
handleQueryAction(q =>
q.addSelect(
- SqlRef.column(column.name),
+ C(column.name),
ingestQueryPattern.metrics
? { insertIndex: 'last-grouping',
addToGroupBy: 'end' }
: {},
diff --git
a/web-console/src/views/sql-data-loader-view/sql-data-loader-view.tsx
b/web-console/src/views/sql-data-loader-view/sql-data-loader-view.tsx
index 162d2fd8c6..23c81d02d2 100644
--- a/web-console/src/views/sql-data-loader-view/sql-data-loader-view.tsx
+++ b/web-console/src/views/sql-data-loader-view/sql-data-loader-view.tsx
@@ -107,7 +107,7 @@ export const SqlDataLoaderView = React.memo(function
SqlDataLoaderView(
onDone={async () => {
const ingestDatasource = SqlQuery.parse(content.queryString)
.getIngestTable()
- ?.getTable();
+ ?.getName();
if (!ingestDatasource) {
AppToaster.show({ message: `Must have an ingest datasource`,
intent: Intent.DANGER });
diff --git
a/web-console/src/views/workbench-view/column-tree/column-tree-menu/number-menu-items/number-menu-items.tsx
b/web-console/src/views/workbench-view/column-tree/column-tree-menu/number-menu-items/number-menu-items.tsx
index c85ddbe9d3..3be7164570 100644
---
a/web-console/src/views/workbench-view/column-tree/column-tree-menu/number-menu-items/number-menu-items.tsx
+++
b/web-console/src/views/workbench-view/column-tree/column-tree-menu/number-menu-items/number-menu-items.tsx
@@ -18,12 +18,12 @@
import { MenuItem } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
-import { SqlExpression, SqlFunction, SqlLiteral, SqlQuery, SqlRef } from
'druid-query-toolkit';
+import { C, F, L, SqlExpression, SqlQuery } from 'druid-query-toolkit';
import React from 'react';
import { prettyPrintSql } from '../../../../../utils';
-const NINE_THOUSAND = SqlLiteral.create(9000);
+const NINE_THOUSAND = L(9000);
export interface NumberMenuItemsProps {
table: string;
@@ -36,7 +36,6 @@ export interface NumberMenuItemsProps {
export const NumberMenuItems = React.memo(function NumberMenuItems(props:
NumberMenuItemsProps) {
function renderFilterMenu(): JSX.Element {
const { columnName, parsedQuery, onQueryChange } = props;
- const ref = SqlRef.column(columnName);
function filterMenuItem(clause: SqlExpression) {
return (
@@ -49,17 +48,18 @@ export const NumberMenuItems = React.memo(function
NumberMenuItems(props: Number
);
}
+ const column = C(columnName);
return (
<MenuItem icon={IconNames.FILTER} text="Filter">
- {filterMenuItem(ref.greaterThan(NINE_THOUSAND))}
- {filterMenuItem(ref.lessThanOrEqual(NINE_THOUSAND))}
+ {filterMenuItem(column.greaterThan(NINE_THOUSAND))}
+ {filterMenuItem(column.lessThanOrEqual(NINE_THOUSAND))}
</MenuItem>
);
}
function renderRemoveFilter(): JSX.Element | undefined {
const { columnName, parsedQuery, onQueryChange } = props;
- if (!parsedQuery.getEffectiveWhereExpression().containsColumn(columnName))
return;
+ if
(!parsedQuery.getEffectiveWhereExpression().containsColumnName(columnName))
return;
return (
<MenuItem
@@ -75,7 +75,6 @@ export const NumberMenuItems = React.memo(function
NumberMenuItems(props: Number
function renderGroupByMenu(): JSX.Element | undefined {
const { columnName, parsedQuery, onQueryChange } = props;
if (!parsedQuery.hasGroupBy()) return;
- const ref = SqlRef.column(columnName);
function groupByMenuItem(ex: SqlExpression, alias?: string) {
return (
@@ -94,13 +93,11 @@ export const NumberMenuItems = React.memo(function
NumberMenuItems(props: Number
);
}
+ const column = C(columnName);
return (
<MenuItem icon={IconNames.GROUP_OBJECTS} text="Group by">
- {groupByMenuItem(ref)}
- {groupByMenuItem(
- SqlFunction.simple('TRUNC', [ref, SqlLiteral.create(-1)]),
- `${columnName}_truncated`,
- )}
+ {groupByMenuItem(column)}
+ {groupByMenuItem(F('TRUNC', column, -1), `${columnName}_truncated`)}
</MenuItem>
);
}
@@ -124,7 +121,6 @@ export const NumberMenuItems = React.memo(function
NumberMenuItems(props: Number
function renderAggregateMenu(): JSX.Element | undefined {
const { columnName, parsedQuery, onQueryChange } = props;
if (!parsedQuery.hasGroupBy()) return;
- const ref = SqlRef.column(columnName);
function aggregateMenuItem(ex: SqlExpression, alias: string) {
return (
@@ -137,17 +133,15 @@ export const NumberMenuItems = React.memo(function
NumberMenuItems(props: Number
);
}
+ const column = C(columnName);
return (
<MenuItem icon={IconNames.FUNCTION} text="Aggregate">
- {aggregateMenuItem(SqlFunction.simple('SUM', [ref]),
`sum_${columnName}`)}
- {aggregateMenuItem(SqlFunction.simple('MIN', [ref]),
`min_${columnName}`)}
- {aggregateMenuItem(SqlFunction.simple('MAX', [ref]),
`max_${columnName}`)}
- {aggregateMenuItem(SqlFunction.simple('AVG', [ref]),
`avg_${columnName}`)}
- {aggregateMenuItem(
- SqlFunction.simple('APPROX_QUANTILE', [ref,
SqlLiteral.create(0.98)]),
- `p98_${columnName}`,
- )}
- {aggregateMenuItem(SqlFunction.simple('LATEST', [ref]),
`latest_${columnName}`)}
+ {aggregateMenuItem(F('SUM', column), `sum_${columnName}`)}
+ {aggregateMenuItem(F('MIN', column), `min_${columnName}`)}
+ {aggregateMenuItem(F('MAX', column), `max_${columnName}`)}
+ {aggregateMenuItem(F('AVG', column), `avg_${columnName}`)}
+ {aggregateMenuItem(F('APPROX_QUANTILE', column, 0.98),
`p98_${columnName}`)}
+ {aggregateMenuItem(F('LATEST', column), `latest_${columnName}`)}
</MenuItem>
);
}
diff --git
a/web-console/src/views/workbench-view/column-tree/column-tree-menu/string-menu-items/string-menu-items.tsx
b/web-console/src/views/workbench-view/column-tree/column-tree-menu/string-menu-items/string-menu-items.tsx
index 807178cb0b..04cc2fe7fd 100644
---
a/web-console/src/views/workbench-view/column-tree/column-tree-menu/string-menu-items/string-menu-items.tsx
+++
b/web-console/src/views/workbench-view/column-tree/column-tree-menu/string-menu-items/string-menu-items.tsx
@@ -18,15 +18,7 @@
import { MenuItem } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
-import {
- SqlExpression,
- SqlFunction,
- SqlJoinPart,
- SqlLiteral,
- SqlQuery,
- SqlRef,
- SqlTableRef,
-} from 'druid-query-toolkit';
+import { C, F, N, SqlExpression, SqlJoinPart, SqlQuery, T } from
'druid-query-toolkit';
import React from 'react';
import { EMPTY_LITERAL, prettyPrintSql } from '../../../../../utils';
@@ -43,7 +35,6 @@ export interface StringMenuItemsProps {
export const StringMenuItems = React.memo(function StringMenuItems(props:
StringMenuItemsProps) {
function renderFilterMenu(): JSX.Element | undefined {
const { columnName, parsedQuery, onQueryChange } = props;
- const ref = SqlRef.column(columnName);
function filterMenuItem(clause: SqlExpression, run = true) {
return (
@@ -56,19 +47,20 @@ export const StringMenuItems = React.memo(function
StringMenuItems(props: String
);
}
+ const column = C(columnName);
return (
<MenuItem icon={IconNames.FILTER} text="Filter">
- {filterMenuItem(ref.isNotNull())}
- {filterMenuItem(ref.equal(EMPTY_LITERAL), false)}
- {filterMenuItem(ref.like(EMPTY_LITERAL), false)}
- {filterMenuItem(SqlFunction.simple('REGEXP_LIKE', [ref,
EMPTY_LITERAL]), false)}
+ {filterMenuItem(column.isNotNull())}
+ {filterMenuItem(column.equal(EMPTY_LITERAL), false)}
+ {filterMenuItem(column.like(EMPTY_LITERAL), false)}
+ {filterMenuItem(F('REGEXP_LIKE', column, EMPTY_LITERAL), false)}
</MenuItem>
);
}
function renderRemoveFilter(): JSX.Element | undefined {
const { columnName, parsedQuery, onQueryChange } = props;
- if (!parsedQuery.getEffectiveWhereExpression().containsColumn(columnName))
return;
+ if
(!parsedQuery.getEffectiveWhereExpression().containsColumnName(columnName))
return;
return (
<MenuItem
@@ -118,24 +110,12 @@ export const StringMenuItems = React.memo(function
StringMenuItems(props: String
);
}
+ const column = C(columnName);
return (
<MenuItem icon={IconNames.GROUP_OBJECTS} text="Group by">
- {groupByMenuItem(SqlRef.column(columnName))}
- {groupByMenuItem(
- SqlFunction.simple('SUBSTRING', [
- SqlRef.column(columnName),
- SqlLiteral.create(1),
- SqlLiteral.create(2),
- ]),
- `${columnName}_substring`,
- )}
- {groupByMenuItem(
- SqlFunction.simple('REGEXP_EXTRACT', [
- SqlRef.column(columnName),
- SqlLiteral.create('(\\d+)'),
- ]),
- `${columnName}_extract`,
- )}
+ {groupByMenuItem(column)}
+ {groupByMenuItem(F('SUBSTRING', column, 1, 2),
`${columnName}_substring`)}
+ {groupByMenuItem(F('REGEXP_EXTRACT', column, '(\\d+)'),
`${columnName}_extract`)}
</MenuItem>
);
}
@@ -143,7 +123,6 @@ export const StringMenuItems = React.memo(function
StringMenuItems(props: String
function renderAggregateMenu(): JSX.Element | undefined {
const { columnName, parsedQuery, onQueryChange } = props;
if (!parsedQuery.hasGroupBy()) return;
- const ref = SqlRef.column(columnName);
function aggregateMenuItem(ex: SqlExpression, alias: string, run = true) {
return (
@@ -156,18 +135,16 @@ export const StringMenuItems = React.memo(function
StringMenuItems(props: String
);
}
+ const column = C(columnName);
return (
<MenuItem icon={IconNames.FUNCTION} text="Aggregate">
- {aggregateMenuItem(SqlFunction.countDistinct(ref),
`dist_${columnName}`)}
+ {aggregateMenuItem(F.countDistinct(column), `dist_${columnName}`)}
{aggregateMenuItem(
- SqlFunction.COUNT_STAR.addWhereExpression(ref.equal(EMPTY_LITERAL)),
+ F.count().addWhereExpression(column.equal(EMPTY_LITERAL)),
`filtered_dist_${columnName}`,
false,
)}
- {aggregateMenuItem(
- SqlFunction.simple('LATEST', [ref, SqlLiteral.create(100)]),
- `latest_${columnName}`,
- )}
+ {aggregateMenuItem(F('LATEST', column, 100), `latest_${columnName}`)}
</MenuItem>
);
}
@@ -175,6 +152,8 @@ export const StringMenuItems = React.memo(function
StringMenuItems(props: String
function renderJoinMenu(): JSX.Element | undefined {
const { schema, table, columnName, parsedQuery, onQueryChange } = props;
if (schema !== 'lookup' || !parsedQuery) return;
+ const firstTableName = parsedQuery.getFirstTableName();
+ if (!firstTableName) return;
const { originalTableColumn, lookupColumn } = getJoinColumns(parsedQuery,
table);
@@ -188,13 +167,15 @@ export const StringMenuItems = React.memo(function
StringMenuItems(props: String
parsedQuery.addJoin(
SqlJoinPart.create(
'LEFT',
- SqlTableRef.create(table, schema),
- SqlRef.column(columnName, table, 'lookup').equal(
- SqlRef.column(
- lookupColumn === columnName ? originalTableColumn :
'XXX',
- parsedQuery.getFirstTableName(),
+ N(schema).table(table),
+ N('lookup')
+ .table(table)
+ .column(columnName)
+ .equal(
+ T(firstTableName).column(
+ lookupColumn === columnName ? originalTableColumn :
'XXX',
+ ),
),
- ),
),
),
false,
@@ -209,13 +190,15 @@ export const StringMenuItems = React.memo(function
StringMenuItems(props: String
parsedQuery.addJoin(
SqlJoinPart.create(
'INNER',
- SqlTableRef.create(table, schema),
- SqlRef.column(columnName, table, 'lookup').equal(
- SqlRef.column(
- lookupColumn === columnName ? originalTableColumn :
'XXX',
- parsedQuery.getFirstTableName(),
+ N(schema).table(table),
+ N('lookup')
+ .table(table)
+ .column(columnName)
+ .equal(
+ T(firstTableName).column(
+ lookupColumn === columnName ? originalTableColumn :
'XXX',
+ ),
),
- ),
),
),
false,
diff --git
a/web-console/src/views/workbench-view/column-tree/column-tree-menu/time-menu-items/time-menu-items.tsx
b/web-console/src/views/workbench-view/column-tree/column-tree-menu/time-menu-items/time-menu-items.tsx
index abfe0f6f26..e9517c0097 100644
---
a/web-console/src/views/workbench-view/column-tree/column-tree-menu/time-menu-items/time-menu-items.tsx
+++
b/web-console/src/views/workbench-view/column-tree/column-tree-menu/time-menu-items/time-menu-items.tsx
@@ -18,7 +18,7 @@
import { MenuDivider, MenuItem } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
-import { SqlExpression, SqlFunction, SqlLiteral, SqlQuery, SqlRef } from
'druid-query-toolkit';
+import { C, F, SqlExpression, SqlQuery } from 'druid-query-toolkit';
import React from 'react';
import { prettyPrintSql } from '../../../../../utils';
@@ -42,12 +42,12 @@ const BETWEEN: SqlExpression = SqlExpression.parse(`(? <= ?
AND ? < ?)`);
// ------------------------------------
function fillWithColumn(b: SqlExpression, columnName: string): SqlExpression {
- return b.fillPlaceholders([SqlRef.column(columnName)]);
+ return b.fillPlaceholders([C(columnName)]);
}
function fillWithColumnStartEnd(columnName: string, start: Date, end: Date):
SqlExpression {
- const ref = SqlRef.column(columnName);
- return BETWEEN.fillPlaceholders([SqlLiteral.create(start), ref, ref,
SqlLiteral.create(end)])!;
+ const column = C(columnName);
+ return BETWEEN.fillPlaceholders([start, column, column, end])!;
}
// ------------------------------------
@@ -160,7 +160,7 @@ export const TimeMenuItems = React.memo(function
TimeMenuItems(props: TimeMenuIt
function renderRemoveFilter(): JSX.Element | undefined {
const { columnName, parsedQuery, onQueryChange } = props;
- if (!parsedQuery.getEffectiveWhereExpression().containsColumn(columnName))
return;
+ if
(!parsedQuery.getEffectiveWhereExpression().containsColumnName(columnName))
return;
return (
<MenuItem
@@ -192,7 +192,6 @@ export const TimeMenuItems = React.memo(function
TimeMenuItems(props: TimeMenuIt
function renderGroupByMenu(): JSX.Element | undefined {
const { columnName, parsedQuery, onQueryChange } = props;
if (!parsedQuery.hasGroupBy()) return;
- const ref = SqlRef.column(columnName);
function groupByMenuItem(ex: SqlExpression, alias: string) {
return (
@@ -211,41 +210,18 @@ export const TimeMenuItems = React.memo(function
TimeMenuItems(props: TimeMenuIt
);
}
+ const column = C(columnName);
return (
<MenuItem icon={IconNames.GROUP_OBJECTS} text="Group by">
- {groupByMenuItem(
- SqlFunction.simple('TIME_FLOOR', [ref, SqlLiteral.create('PT1H')]),
- `${columnName}_by_hour`,
- )}
- {groupByMenuItem(
- SqlFunction.simple('TIME_FLOOR', [ref, SqlLiteral.create('P1D')]),
- `${columnName}_by_day`,
- )}
- {groupByMenuItem(
- SqlFunction.simple('TIME_FLOOR', [ref, SqlLiteral.create('P1M')]),
- `${columnName}_by_month`,
- )}
- {groupByMenuItem(
- SqlFunction.simple('TIME_FLOOR', [ref, SqlLiteral.create('P1Y')]),
- `${columnName}_by_year`,
- )}
+ {groupByMenuItem(F.timeFloor(column, 'PT1H'), `${columnName}_by_hour`)}
+ {groupByMenuItem(F.timeFloor(column, 'P1D'), `${columnName}_by_day`)}
+ {groupByMenuItem(F.timeFloor(column, 'P1M'), `${columnName}_by_month`)}
+ {groupByMenuItem(F.timeFloor(column, 'P1Y'), `${columnName}_by_year`)}
<MenuDivider />
- {groupByMenuItem(
- SqlFunction.simple('TIME_EXTRACT', [ref, SqlLiteral.create('HOUR')]),
- `hour_of_${columnName}`,
- )}
- {groupByMenuItem(
- SqlFunction.simple('TIME_EXTRACT', [ref, SqlLiteral.create('DAY')]),
- `day_of_${columnName}`,
- )}
- {groupByMenuItem(
- SqlFunction.simple('TIME_EXTRACT', [ref,
SqlLiteral.create('MONTH')]),
- `month_of_${columnName}`,
- )}
- {groupByMenuItem(
- SqlFunction.simple('TIME_EXTRACT', [ref, SqlLiteral.create('YEAR')]),
- `year_of_${columnName}`,
- )}
+ {groupByMenuItem(F('TIME_EXTRACT', column, 'HOUR'),
`hour_of_${columnName}`)}
+ {groupByMenuItem(F('TIME_EXTRACT', column, 'DAY'),
`day_of_${columnName}`)}
+ {groupByMenuItem(F('TIME_EXTRACT', column, 'MONTH'),
`month_of_${columnName}`)}
+ {groupByMenuItem(F('TIME_EXTRACT', column, 'YEAR'),
`year_of_${columnName}`)}
</MenuItem>
);
}
@@ -253,7 +229,6 @@ export const TimeMenuItems = React.memo(function
TimeMenuItems(props: TimeMenuIt
function renderAggregateMenu(): JSX.Element | undefined {
const { columnName, parsedQuery, onQueryChange } = props;
if (!parsedQuery.hasGroupBy()) return;
- const ref = SqlRef.column(columnName);
function aggregateMenuItem(ex: SqlExpression, alias: string) {
return (
@@ -266,10 +241,11 @@ export const TimeMenuItems = React.memo(function
TimeMenuItems(props: TimeMenuIt
);
}
+ const column = C(columnName);
return (
<MenuItem icon={IconNames.FUNCTION} text="Aggregate">
- {aggregateMenuItem(SqlFunction.simple('MAX', [ref]),
`max_${columnName}`)}
- {aggregateMenuItem(SqlFunction.simple('MIN', [ref]),
`min_${columnName}`)}
+ {aggregateMenuItem(F.max(column), `max_${columnName}`)}
+ {aggregateMenuItem(F.min(column), `min_${columnName}`)}
</MenuItem>
);
}
diff --git a/web-console/src/views/workbench-view/column-tree/column-tree.tsx
b/web-console/src/views/workbench-view/column-tree/column-tree.tsx
index f70439f4f2..3611630d76 100644
--- a/web-console/src/views/workbench-view/column-tree/column-tree.tsx
+++ b/web-console/src/views/workbench-view/column-tree/column-tree.tsx
@@ -20,13 +20,16 @@ import { HTMLSelect, Menu, MenuItem, Position, Tree,
TreeNodeInfo } from '@bluep
import { IconNames } from '@blueprintjs/icons';
import { Popover2 } from '@blueprintjs/popover2';
import {
+ C,
+ F,
+ N,
+ SqlColumn,
SqlComparison,
SqlExpression,
- SqlFunction,
SqlJoinPart,
SqlQuery,
- SqlRef,
- SqlTableRef,
+ SqlTable,
+ T,
} from 'druid-query-toolkit';
import React, { ChangeEvent } from 'react';
@@ -44,12 +47,12 @@ import { NumberMenuItems, StringMenuItems, TimeMenuItems }
from './column-tree-m
import './column-tree.scss';
-const COUNT_STAR = SqlFunction.COUNT_STAR.as('Count');
+const COUNT_STAR = F.count().as('Count');
function getCountExpression(columnNames: string[]): SqlExpression {
for (const columnName of columnNames) {
if (columnName === 'count' || columnName === '__count') {
- return SqlFunction.simple('SUM',
[SqlRef.column(columnName)]).as('Count');
+ return F.sum(C(columnName)).as('Count');
}
}
return COUNT_STAR;
@@ -96,22 +99,22 @@ function handleColumnShow(options:
HandleColumnClickOptions): void {
where = parsedQuery.getWhereExpression();
aggregates = parsedQuery.getAggregateSelectExpressions();
} else if (columnSchema === 'druid') {
- from = SqlTableRef.create(columnTable);
+ from = T(columnTable);
where = defaultWhere;
} else {
- from = SqlTableRef.create(columnTable, columnSchema);
+ from = N(columnSchema).table(columnTable);
}
if (!aggregates.length) {
aggregates.push(COUNT_STAR);
}
- const columnRef = SqlRef.column(columnName);
+ const column = C(columnName);
let query: SqlQuery;
if (columnSchema === 'druid' && columnType === 'TIMESTAMP') {
- query = TIME_QUERY.fillPlaceholders([columnRef, from]) as SqlQuery;
+ query = TIME_QUERY.fillPlaceholders([column, from]) as SqlQuery;
} else {
- query = STRING_QUERY.fillPlaceholders([columnRef, from]) as SqlQuery;
+ query = STRING_QUERY.fillPlaceholders([column, from]) as SqlQuery;
}
let newSelectExpressions = query.selectExpressions;
@@ -152,11 +155,11 @@ export function getJoinColumns(parsedQuery: SqlQuery,
_table: string) {
const firstOnExpression =
parsedQuery.fromClause.joinParts.first().onExpression;
if (firstOnExpression instanceof SqlComparison && firstOnExpression.op ===
'=') {
const { lhs, rhs } = firstOnExpression;
- if (lhs instanceof SqlRef && lhs.getNamespace() === 'lookup') {
- lookupColumn = lhs.getColumn();
+ if (lhs instanceof SqlColumn && lhs.getNamespaceName() === 'lookup') {
+ lookupColumn = lhs.getName();
}
- if (rhs instanceof SqlRef) {
- originalTableColumn = rhs.getColumn();
+ if (rhs instanceof SqlColumn) {
+ originalTableColumn = rhs.getName();
}
}
}
@@ -199,7 +202,7 @@ export class ColumnTree extends
React.PureComponent<ColumnTreeProps, ColumnTreeS
<Deferred
content={() => {
const parsedQuery = props.getParsedQuery();
- const tableRef = SqlTableRef.create(tableName);
+ const tableRef = T(tableName);
const prettyTableRef = prettyPrintSql(tableRef);
const countExpression = getCountExpression(
metadata.map(child => child.COLUMN_NAME),
@@ -207,7 +210,7 @@ export class ColumnTree extends
React.PureComponent<ColumnTreeProps, ColumnTreeS
const getQueryOnTable = () => {
return SqlQuery.create(
- SqlTableRef.create(
+ SqlTable.create(
tableName,
schemaName === 'druid' ? undefined : schemaName,
),
@@ -235,7 +238,7 @@ export class ColumnTree extends
React.PureComponent<ColumnTreeProps, ColumnTreeS
.changeSelectExpressions(
metadata
.map(child => child.COLUMN_NAME)
- .map(columnName =>
SqlRef.column(columnName)),
+ .map(columnName => C(columnName)),
)
.changeWhereExpression(getWhere()),
true,
@@ -297,13 +300,16 @@ export class ColumnTree extends
React.PureComponent<ColumnTreeProps, ColumnTreeS
.addJoin(
SqlJoinPart.create(
'LEFT',
- SqlTableRef.create(tableName,
schemaName),
- SqlRef.column(lookupColumn,
tableName, 'lookup').equal(
- SqlRef.column(
- originalTableColumn,
-
parsedQuery.getFirstTableName(),
+ N(schemaName).table(tableName),
+ N('lookup')
+ .table(tableName)
+ .column(lookupColumn)
+ .equal(
+ SqlColumn.create(
+ originalTableColumn,
+
parsedQuery.getFirstTableName(),
+ ),
),
- ),
),
),
false,
@@ -322,13 +328,16 @@ export class ColumnTree extends
React.PureComponent<ColumnTreeProps, ColumnTreeS
parsedQuery.addJoin(
SqlJoinPart.create(
'INNER',
- SqlTableRef.create(tableName,
schemaName),
- SqlRef.column(lookupColumn,
tableName, 'lookup').equal(
- SqlRef.column(
- originalTableColumn,
- parsedQuery.getFirstTableName(),
+ N(schemaName).table(tableName),
+ N('lookup')
+ .table(tableName)
+ .column(lookupColumn)
+ .equal(
+ SqlColumn.create(
+ originalTableColumn,
+
parsedQuery.getFirstTableName(),
+ ),
),
- ),
),
),
false,
diff --git
a/web-console/src/views/workbench-view/flexible-query-input/flexible-query-input.tsx
b/web-console/src/views/workbench-view/flexible-query-input/flexible-query-input.tsx
index 1559e7981c..7e73f4012d 100644
---
a/web-console/src/views/workbench-view/flexible-query-input/flexible-query-input.tsx
+++
b/web-console/src/views/workbench-view/flexible-query-input/flexible-query-input.tsx
@@ -21,7 +21,7 @@ import { ResizeSensor2 } from '@blueprintjs/popover2';
import type { Ace } from 'ace-builds';
import ace from 'ace-builds';
import classNames from 'classnames';
-import { SqlRef, SqlTableRef } from 'druid-query-toolkit';
+import { C, T } from 'druid-query-toolkit';
import escape from 'lodash.escape';
import React from 'react';
import AceEditor from 'react-ace';
@@ -164,7 +164,7 @@ export class FlexibleQueryInput extends React.PureComponent<
) {
const completions = ([] as any[]).concat(
uniq(columnMetadata.map(d => d.TABLE_SCHEMA)).map(v => ({
- value: SqlTableRef.create(v).toString(),
+ value: String(T(v)),
score: 10,
meta: 'schema',
})),
@@ -173,7 +173,7 @@ export class FlexibleQueryInput extends React.PureComponent<
.filter(d => (currentSchema ? d.TABLE_SCHEMA === currentSchema :
true))
.map(d => d.TABLE_NAME),
).map(v => ({
- value: SqlTableRef.create(v).toString(),
+ value: String(T(v)),
score: 49,
meta: 'datasource',
})),
@@ -186,7 +186,7 @@ export class FlexibleQueryInput extends React.PureComponent<
)
.map(d => d.COLUMN_NAME),
).map(v => ({
- value: SqlRef.column(v).toString(),
+ value: String(C(v)),
score: 50,
meta: 'column',
})),
diff --git
a/web-console/src/views/workbench-view/ingest-success-pane/ingest-success-pane.tsx
b/web-console/src/views/workbench-view/ingest-success-pane/ingest-success-pane.tsx
index 9903529256..11c0d958b9 100644
---
a/web-console/src/views/workbench-view/ingest-success-pane/ingest-success-pane.tsx
+++
b/web-console/src/views/workbench-view/ingest-success-pane/ingest-success-pane.tsx
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-import { SqlTableRef } from 'druid-query-toolkit';
+import { T } from 'druid-query-toolkit';
import React from 'react';
import { Execution, WorkbenchQuery } from '../../../druid-models';
@@ -47,7 +47,7 @@ export const IngestSuccessPane = React.memo(function
IngestSuccessPane(
? stages.getTotalCounterForStage(lastStage, 'input0', 'rows') // Assume
input0 since we know the segmentGenerator will only ever have one stage input
: -1;
- const table = SqlTableRef.create(datasource);
+ const table = T(datasource);
const warnings = stages?.getWarningCount() || 0;
diff --git
a/web-console/src/views/workbench-view/input-format-step/input-format-step.tsx
b/web-console/src/views/workbench-view/input-format-step/input-format-step.tsx
index 0b92ae3ba9..c6fce295dd 100644
---
a/web-console/src/views/workbench-view/input-format-step/input-format-step.tsx
+++
b/web-console/src/views/workbench-view/input-format-step/input-format-step.tsx
@@ -18,7 +18,7 @@
import { Button, Callout, FormGroup, Icon, Intent, Tag } from
'@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
-import { SqlExpression, SqlRef } from 'druid-query-toolkit';
+import { C, SqlExpression } from 'druid-query-toolkit';
import React, { useState } from 'react';
import { AutoForm, CenterMessage, LearnMore, Loader } from
'../../../components';
@@ -135,7 +135,7 @@ export const InputFormatStep = React.memo(function
InputFormatStep(props: InputF
return {
column,
- timeExpression: formatSql.fillPlaceholders([SqlRef.column(column)]),
+ timeExpression: formatSql.fillPlaceholders([C(column)]),
};
})[0];
}
diff --git
a/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx
b/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx
index 5911eb1c50..d4069fd0ed 100644
---
a/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx
+++
b/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx
@@ -21,7 +21,7 @@ import { IconName, IconNames } from '@blueprintjs/icons';
import { Popover2 } from '@blueprintjs/popover2';
import classNames from 'classnames';
import copy from 'copy-to-clipboard';
-import { SqlTableRef } from 'druid-query-toolkit';
+import { T } from 'druid-query-toolkit';
import React, { useState } from 'react';
import { Loader } from '../../../components';
@@ -182,10 +182,8 @@ LIMIT 100`,
w.datasource !== WorkbenchQuery.INLINE_DATASOURCE_MARKER && (
<MenuItem
icon={IconNames.APPLICATION}
- text={`SELECT * FROM
${SqlTableRef.create(w.datasource)}`}
- onClick={() =>
- onChangeQuery(`SELECT * FROM
${SqlTableRef.create(w.datasource)}`)
- }
+ text={`SELECT * FROM ${T(w.datasource)}`}
+ onClick={() => onChangeQuery(`SELECT * FROM
${T(w.datasource)}`)}
/>
)}
<MenuItem
diff --git
a/web-console/src/views/workbench-view/result-table-pane/result-table-pane.tsx
b/web-console/src/views/workbench-view/result-table-pane/result-table-pane.tsx
index 8dc66584fa..c2b25b40d4 100644
---
a/web-console/src/views/workbench-view/result-table-pane/result-table-pane.tsx
+++
b/web-console/src/views/workbench-view/result-table-pane/result-table-pane.tsx
@@ -21,14 +21,15 @@ import { IconNames } from '@blueprintjs/icons';
import { Popover2 } from '@blueprintjs/popover2';
import classNames from 'classnames';
import {
+ C,
Column,
+ F,
QueryResult,
SqlAlias,
SqlExpression,
SqlFunction,
SqlLiteral,
SqlQuery,
- SqlRef,
SqlStar,
} from 'druid-query-toolkit';
import * as JSONBig from 'json-bigint-native';
@@ -65,10 +66,6 @@ import './result-table-pane.scss';
const CAST_TARGETS: string[] = ['VARCHAR', 'BIGINT', 'DOUBLE'];
-function jsonValue(ex: SqlExpression, path: string): SqlExpression {
- return SqlExpression.parse(`JSON_VALUE(${ex}, ${SqlLiteral.create(path)})`);
-}
-
function getJsonPaths(jsons: Record<string, any>[]): string[] {
return ['$.'].concat(computeFlattenExprsForData(jsons, 'include-arrays',
true));
}
@@ -118,15 +115,15 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
if (!parsedQuery ||
!parsedQuery.isRealOutputColumnAtSelectIndex(headerIndex)) return false;
return (
- parsedQuery.getEffectiveWhereExpression().containsColumn(header) ||
- parsedQuery.getEffectiveHavingExpression().containsColumn(header)
+ parsedQuery.getEffectiveWhereExpression().containsColumnName(header) ||
+ parsedQuery.getEffectiveHavingExpression().containsColumnName(header)
);
}
function getHeaderMenu(column: Column, headerIndex: number) {
const header = column.name;
const type = column.sqlType || column.nativeType;
- const ref = SqlRef.column(header);
+ const ref = C(header);
const prettyRef = prettyPrintSql(ref);
const menuItems: JSX.Element[] = [];
@@ -136,7 +133,7 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
const orderByExpression = parsedQuery.isValidSelectIndex(headerIndex)
? SqlLiteral.index(headerIndex)
- : SqlRef.column(header);
+ : ref;
const descOrderBy = orderByExpression.toOrderByExpression('DESC');
const ascOrderBy = orderByExpression.toOrderByExpression('ASC');
const orderBy = parsedQuery.getOrderByForSelectIndex(headerIndex);
@@ -254,7 +251,7 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
if (!selectExpression) return;
onQueryAction(q =>
q.addSelect(
-
jsonValue(selectExpression.getUnderlyingExpression(), path).as(
+ F('JSON_VALUE',
selectExpression.getUnderlyingExpression(), path).as(
selectExpression.getOutputName() +
path.replace(/^\$/, ''),
),
{ insertIndex: headerIndex + 1 },
@@ -271,7 +268,7 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
if (parsedQuery.isRealOutputColumnAtSelectIndex(headerIndex)) {
const whereExpression = parsedQuery.getWhereExpression();
- if (whereExpression && whereExpression.containsColumn(header)) {
+ if (whereExpression && whereExpression.containsColumnName(header)) {
menuItems.push(
<MenuItem
key="remove_where"
@@ -287,7 +284,7 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
}
const havingExpression = parsedQuery.getHavingExpression();
- if (havingExpression && havingExpression.containsColumn(header)) {
+ if (havingExpression && havingExpression.containsColumnName(header)) {
menuItems.push(
<MenuItem
key="remove_having"
@@ -386,31 +383,19 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
<MenuItem
text="Convert to SUM(...)"
onClick={() => {
- convertToAggregate(
- SqlFunction.simple('SUM',
[underlyingSelectExpression]).as(
- `sum_${header}`,
- ),
- );
+
convertToAggregate(F.sum(underlyingSelectExpression).as(`sum_${header}`));
}}
/>
<MenuItem
text="Convert to MIN(...)"
onClick={() => {
- convertToAggregate(
- SqlFunction.simple('MIN',
[underlyingSelectExpression]).as(
- `min_${header}`,
- ),
- );
+
convertToAggregate(F.min(underlyingSelectExpression).as(`min_${header}`));
}}
/>
<MenuItem
text="Convert to MAX(...)"
onClick={() => {
- convertToAggregate(
- SqlFunction.simple('MAX',
[underlyingSelectExpression]).as(
- `max_${header}`,
- ),
- );
+
convertToAggregate(F.max(underlyingSelectExpression).as(`max_${header}`));
}}
/>
</>
@@ -419,9 +404,7 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
text="Convert to COUNT(DISTINCT ...)"
onClick={() => {
convertToAggregate(
- SqlFunction.decorated('COUNT', 'DISTINCT',
[underlyingSelectExpression]).as(
- `unique_${header}`,
- ),
+
F.countDistinct(underlyingSelectExpression).as(`unique_${header}`),
);
}}
/>
@@ -429,9 +412,9 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
text="Convert to APPROX_COUNT_DISTINCT_DS_HLL(...)"
onClick={() => {
convertToAggregate(
- SqlFunction.simple('APPROX_COUNT_DISTINCT_DS_HLL', [
- underlyingSelectExpression,
- ]).as(`unique_${header}`),
+ F('APPROX_COUNT_DISTINCT_DS_HLL',
underlyingSelectExpression).as(
+ `unique_${header}`,
+ ),
);
}}
/>
@@ -439,9 +422,9 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
text="Convert to APPROX_COUNT_DISTINCT_DS_THETA(...)"
onClick={() => {
convertToAggregate(
- SqlFunction.simple('APPROX_COUNT_DISTINCT_DS_THETA', [
- underlyingSelectExpression,
- ]).as(`unique_${header}`),
+ F('APPROX_COUNT_DISTINCT_DS_THETA',
underlyingSelectExpression).as(
+ `unique_${header}`,
+ ),
);
}}
/>
@@ -496,7 +479,7 @@ export const ResultTablePane = React.memo(function
ResultTablePane(props: Result
);
if (!runeMode) {
- const orderByExpression = SqlRef.column(header);
+ const orderByExpression = ref;
const descOrderBy = orderByExpression.toOrderByExpression('DESC');
const ascOrderBy = orderByExpression.toOrderByExpression('ASC');
const descOrderByPretty = prettyPrintSql(descOrderBy);
diff --git
a/web-console/src/views/workbench-view/time-floor-menu-item/time-floor-menu-item.tsx
b/web-console/src/views/workbench-view/time-floor-menu-item/time-floor-menu-item.tsx
index 44948efbd9..6609889afc 100644
---
a/web-console/src/views/workbench-view/time-floor-menu-item/time-floor-menu-item.tsx
+++
b/web-console/src/views/workbench-view/time-floor-menu-item/time-floor-menu-item.tsx
@@ -18,10 +18,10 @@
import { MenuItem } from '@blueprintjs/core';
import { IconNames } from '@blueprintjs/icons';
-import { SqlExpression, SqlFunction, SqlLiteral } from 'druid-query-toolkit';
+import { F, SqlExpression, SqlFunction } from 'druid-query-toolkit';
import React from 'react';
-import { compact, oneOf, tickIcon } from '../../../utils';
+import { oneOf, tickIcon } from '../../../utils';
const OPTIONS: { label: string; value: string }[] = [
{ label: 'Second', value: 'PT1S' },
@@ -53,16 +53,16 @@ export const TimeFloorMenuItem = function
TimeFloorMenuItem(props: TimeFloorMenu
let innerExpression = expression.getUnderlyingExpression();
let currentDuration: string | undefined;
- let origin: SqlExpression | undefined;
- let timezone: SqlExpression | undefined;
+ let origin: string | undefined;
+ let timezone: string | undefined;
if (
innerExpression instanceof SqlFunction &&
oneOf(innerExpression.getEffectiveFunctionName(), 'TIME_FLOOR', 'FLOOR')
) {
const firstArg = innerExpression.getArg(0);
const secondArg = innerExpression.getArgAsString(1)?.toUpperCase();
- origin = innerExpression.getArg(2);
- timezone = innerExpression.getArg(3);
+ origin = innerExpression.getArgAsString(2);
+ timezone = innerExpression.getArgAsString(3);
if (firstArg && secondArg) {
innerExpression = firstArg;
currentDuration = UNIT_TO_DURATION[secondArg] || secondArg;
@@ -71,13 +71,9 @@ export const TimeFloorMenuItem = function
TimeFloorMenuItem(props: TimeFloorMenu
const changeTimeFloor = (duration: string | undefined) => {
onChange(
- (duration
- ? SqlFunction.simple(
- 'TIME_FLOOR',
- compact([innerExpression, SqlLiteral.create(duration), origin,
timezone]),
- )
- : innerExpression
- ).as(expression.getOutputName()),
+ (duration ? F.timeFloor(innerExpression, duration, origin, timezone) :
innerExpression).as(
+ expression.getOutputName(),
+ ),
);
};
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]