diff --git a/src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts b/src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts index 94cc3f0bd..bd04e900e 100644 --- a/src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts +++ b/src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts @@ -177,7 +177,7 @@ export default class QueryBuilderViewModel { return filterString.trim(); }; - public getSqlFilterFromClauses = (): string => { + public getSqlFilterFromClauses = (queryTableRows: IQueryTableRowsType[]): string => { var filterString: string = "SELECT * FROM c"; if (this._queryViewModel.selectText() && this._queryViewModel.selectText().length > 0) { filterString = "SELECT"; @@ -200,44 +200,45 @@ export default class QueryBuilderViewModel { }); filterString = filterString.concat(" FROM c"); } - if (this.queryClauses.children.length === 0) { + if (queryTableRows.length === 0) { return filterString; } filterString = filterString.concat(" WHERE"); var first = true; - var treeTraversal = (group: ClauseGroup): void => { - for (var i = 0; i < group.children.length; i++) { - var currentItem = group.children[i]; + // var treeTraversal = (group: ClauseGroup): void => { + for (var i = 0; i < queryTableRows.length; i++) { + var currentItem = queryTableRows[i]; - if (currentItem instanceof QueryClauseViewModel) { - var clause = currentItem; - let timeStampValue: string = this.timestampToSqlValue(clause); - var value = clause.value(); - if (!clause.isValue()) { - value = timeStampValue; - } - filterString = filterString.concat( - this.constructSqlClause( - first ? "" : clause.and_or(), - this.generateLeftParentheses(clause), - clause.field(), - clause.type(), - clause.operator(), - value, - this.generateRightParentheses(clause) - ) - ); - first = false; - } - - if (currentItem instanceof ClauseGroup) { - treeTraversal(currentItem); - } + // if (currentItem instanceof QueryClauseViewModel) { + // var clause = currentItem; + let timeStampValue: string = this.timestampToSqlValue(currentItem); + var value = currentItem.entityValue; + if (!currentItem.isValue) { + value = timeStampValue; } - }; + filterString = filterString.concat( + this.constructSqlClause( + first ? "" : currentItem.selectedOperation, + this.generateLeftParentheses(currentItem), + currentItem.selectedField, + currentItem.selectedEntityType, + currentItem.selectedOperator, + value, + this.generateRightParentheses(currentItem) + ) + ); + first = false; + // } - treeTraversal(this.queryClauses); + // if (currentItem instanceof ClauseGroup) { + // treeTraversal(currentItem); + // } + // } + } + // treeTraversal(this.queryClauses); + + console.log("🚀 ~ file: QueryBuilderViewModel.ts ~ line 250 ~ QueryBuilderViewModel ~ filterString", filterString); return filterString.trim(); }; @@ -735,18 +736,18 @@ export default class QueryBuilderViewModel { } } - private timestampToSqlValue(clause: QueryClauseViewModel): string { - if (clause.isValue()) { + private timestampToSqlValue(clause: IQueryTableRowsType): string { + if (clause.isValue) { return null; - } else if (clause.isTimestamp()) { + } else if (clause.isTimestamp) { return this.getTimeStampToSqlQuery(clause); // } else if (clause.isCustomLastTimestamp()) { // clause.value(CustomTimestampHelper._queryLastTime(clause.customLastTimestamp().lastNumber, clause.customLastTimestamp().lastTimeUnit)); - } else if (clause.isCustomRangeTimestamp()) { - if (clause.isLocal()) { - return DateTimeUtilities.getUTCDateTime(clause.customTimeValue()); + } else if (clause.isCustomRangeTimestamp) { + if (clause.isLocal) { + return DateTimeUtilities.getUTCDateTime(clause.customTimeValue); } else { - return clause.customTimeValue(); + return clause.customTimeValue; } } return null; @@ -778,8 +779,8 @@ export default class QueryBuilderViewModel { } } - private getTimeStampToSqlQuery(clause: QueryClauseViewModel): string { - switch (clause.timeValue()) { + private getTimeStampToSqlQuery(clause: IQueryTableRowsType): string { + switch (clause.timeValue) { case Constants.timeOptions.lastHour: return CustomTimestampHelper._queryLastDaysHours(0, 1); case Constants.timeOptions.last24Hours: diff --git a/src/Explorer/Tables/QueryBuilder/QueryViewModel.tsx b/src/Explorer/Tables/QueryBuilder/QueryViewModel.tsx index 28dc268cd..948286e6d 100644 --- a/src/Explorer/Tables/QueryBuilder/QueryViewModel.tsx +++ b/src/Explorer/Tables/QueryBuilder/QueryViewModel.tsx @@ -140,13 +140,13 @@ export default class QueryViewModel { return this.queryText(); }; - private setSqlFilter = (): string => { - return this.queryBuilderViewModel().getSqlFilterFromClauses(); + private setSqlFilter = (queryTableRows: IQueryTableRowsType[]): string => { + return this.queryBuilderViewModel().getSqlFilterFromClauses(queryTableRows); }; - private setCqlFilter = (): string => { - return this.queryBuilderViewModel().getCqlFilterFromClauses(); - }; + // private setCqlFilter = (): string => { + // return this.queryBuilderViewModel().getCqlFilterFromClauses(); + // }; public isHelperEnabled = ko .computed(() => { @@ -161,7 +161,7 @@ export default class QueryViewModel { notify: "always", }); - public runQuery = (queryTableRows: IQueryTableRowsType[]): void => { + public runQuery = (queryTableRows: IQueryTableRowsType[]): string => { console.log( "🚀 ~ file: QueryViewModel.tsx ~ line 169 ~ QueryViewModel ~ //constructor ~ queryTableRows", queryTableRows @@ -177,9 +177,10 @@ export default class QueryViewModel { this._tableEntityListViewModel.tableQuery.top = top; this._tableEntityListViewModel.tableQuery.select = select; this._tableEntityListViewModel.oDataQuery(filter); - this._tableEntityListViewModel.sqlQuery(this.setSqlFilter()); + this._tableEntityListViewModel.sqlQuery(this.setSqlFilter(queryTableRows)); this._tableEntityListViewModel.cqlQuery(filter); + return this._tableEntityListViewModel.sqlQuery(); // return this._tableEntityListViewModel.reloadTable(/*useSetting*/ false, /*resetHeaders*/ false); }; diff --git a/src/Explorer/Tabs/QueryTablesTab/QueryTablesTabComponent.tsx b/src/Explorer/Tabs/QueryTablesTab/QueryTablesTabComponent.tsx index 0d1e8e315..36723231f 100644 --- a/src/Explorer/Tabs/QueryTablesTab/QueryTablesTabComponent.tsx +++ b/src/Explorer/Tabs/QueryTablesTab/QueryTablesTabComponent.tsx @@ -1,5 +1,6 @@ import { FeedOptions } from "@azure/cosmos"; import { + CheckboxVisibility, DetailsList, DetailsListLayoutMode, IColumn, @@ -62,60 +63,11 @@ export interface Button { isSelected?: boolean; } -// export interface IDocument { -// partitionKey: string; -// rowKey: string; -// timeStamp: string; -// } -// export interface IQueryTablesTabComponentProps { -// tabKind: ViewModels.CollectionTabKind; -// title: string; -// tabPath: string; -// collection: ViewModels.CollectionBase; -// node: ViewModels.TreeNode; -// onLoadStartKey: number; -// container: Explorer; -// tabsBaseInstance: TabsBase; -// queryTablesTab: NewQueryTablesTab; -// } - -// interface IQueryTablesTabComponentStates { -// tableEntityListViewModel: TableEntityListViewModel; -// queryViewModel: QueryViewModel; -// queryText: string; -// selectedQueryText: string; -// executeQueryButton: Button; -// queryBuilderButton: Button; -// queryTextButton: Button; -// addEntityButton: Button; -// editEntityButton: Button; -// deleteEntityButton: Button; -// isHelperActive: boolean; -// columns: IColumn[]; -// items: IDocument[]; -// isExpanded: boolean; -// isEditorActive: boolean; -// selectedItems: Entities.ITableEntity[]; -// isValue: boolean; -// isTimestamp: boolean; -// isCustomLastTimestamp: boolean; -// isCustomRangeTimestamp: boolean; -// operators: string[]; -// selectMessage: string; -// queryTableRows: IQueryTableRowsType[]; -// } - class QueryTablesTabComponent extends Component { - // public readonly html = template; public collection: ViewModels.Collection; - // public tableEntityListViewModel = ko.observable(); public _queryViewModel: QueryViewModel; public tableCommands: TableCommands; public tableDataClient: TableDataClient; - - // public queryText = ko.observable("PartitionKey eq 'partitionKey1'"); // Start out with an example they can modify - // public selectedQueryText = ko.observable("").extend({ notify: "always" }); - public executeQueryButton: ViewModels.Button; public addEntityButton: ViewModels.Button; public editEntityButton: ViewModels.Button; @@ -157,7 +109,7 @@ class QueryTablesTabComponent extends Component { @@ -553,12 +509,25 @@ class QueryTablesTabComponent extends Component { + // // console.log( + // // "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 559 ~ QueryTablesTabComponent ~ headers.map ~ item", + // // item + // // ); + // return ( + // <> + // {item[header] &&
{item[header]}
} + // {!item[header] && ( + //
{"."}
+ // )} + // + // ); + // }, }); }); const documentItems = this.generateDetailsList(documents.Results); - // const queryTableRowsClone = [...queryTableRows]; - // queryTableRowsClone[0].fieldOptions = getformattedOptions(headers); this.setState( { columns: this.columns, @@ -577,8 +546,32 @@ class QueryTablesTabComponent extends Component, column: IColumn): void => { + const { columns, items } = this.state; + const newColumns: IColumn[] = columns.slice(); + const currColumn: IColumn = newColumns.filter((currCol) => column.key === currCol.key)[0]; + newColumns.forEach((newCol: IColumn) => { + if (newCol === currColumn) { + currColumn.isSortedDescending = !currColumn.isSortedDescending; + currColumn.isSorted = true; + } else { + newCol.isSorted = false; + newCol.isSortedDescending = true; + } + }); + //eslint-disable-next-line + const newItems = this.copyAndSort(items, currColumn.fieldName!, currColumn.isSortedDescending); + this.setState({ + columns: newColumns, + items: newItems, + }); + }; + + private copyAndSort(items: T[], columnKey: string, isSortedDescending?: boolean): T[] { + const key = columnKey as keyof T; + return items.slice(0).sort((a: T, b: T) => ((isSortedDescending ? a[key] < b[key] : a[key] > b[key]) ? 1 : -1)); } private getFormattedHeaders = (entities: Entities.ITableEntity[]): string[] => { @@ -664,6 +657,9 @@ class QueryTablesTabComponent extends Component { return this.state.tableEntityListViewModel.removeEntitiesFromCache(entitiesToDelete).then(() => { - // this.state.tableEntityListViewModel.redrawTableThrottled(); - this.componentDidMount(); + this.setState({ + isLoading: true, + }); + this.loadEntities(false); }); }); } }; public runQuery(queryTableRows: IQueryTableRowsType[]): void { - this.state.queryViewModel.runQuery(queryTableRows); - if (queryTableRows.length !== 0) { + // this.state.queryViewModel.runQuery(queryTableRows); + this.setState({ + isLoading: true, + selectedQueryText: this.state.queryViewModel.runQuery(queryTableRows), + }); + setTimeout(() => { console.log( - "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 507 ~ QueryTablesTabComponent ~ runQuery ~ queryTableRows", - queryTableRows + "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 775 ~ QueryTablesTabComponent ~ runQuery ~ selectedQueryText", + this.state.selectedQueryText ); - let exp: string; - queryTableRows.map((row, index) => { - console.log( - "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 508 ~ QueryTablesTabComponent ~ runQuery ~ row", - row - ); - const operation = row.selectedOperation === "And" ? " && " : " || "; - const operator = this.getOperator(row.selectedOperator); - if (index === 0) { - exp = "row['" + row.selectedField + "'] " + operator + "'" + row.entityValue + "'"; - } else { - exp = exp + operation + "row['" + row.selectedField + "'] " + operator + "'" + row.entityValue + "'"; - } - }); - console.log( - "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 519 ~ QueryTablesTabComponent ~ queryTableRows.map ~ exp", - exp - ); - const filteredItems = this.state.originalItems.filter((row) => eval(exp)); - console.log( - "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 526 ~ QueryTablesTabComponent ~ runQuery ~ newRows", - filteredItems - ); - this.setState({ - queryText: this.state.queryViewModel.queryText(), - items: filteredItems, - }); - } else { - this.setState({ - queryText: this.state.queryViewModel.queryText(), - items: this.state.originalItems, - }); - } + this.loadEntities(false); + }, 2000); + // if (queryTableRows.length !== 0) { + // console.log( + // "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 507 ~ QueryTablesTabComponent ~ runQuery ~ queryTableRows", + // queryTableRows, + // ", ", + // this.state.tableEntityListViewModel.sqlQuery(), + // ", ", + // this.state.queryViewModel.runQuery(queryTableRows) + // ); + + // let exp: string; + // queryTableRows.map((row, index) => { + // console.log( + // "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 508 ~ QueryTablesTabComponent ~ runQuery ~ row", + // row + // ); + // const operation = row.selectedOperation === "And" ? " && " : " || "; + // const operator = this.getOperator(row.selectedOperator); + // if (index === 0) { + // exp = "row['" + row.selectedField + "'] " + operator + "'" + row.entityValue + "'"; + // } else { + // exp = exp + operation + "row['" + row.selectedField + "'] " + operator + "'" + row.entityValue + "'"; + // } + // }); + // console.log( + // "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 519 ~ QueryTablesTabComponent ~ queryTableRows.map ~ exp", + // exp + // ); + // const filteredItems = this.state.originalItems.filter((row) => eval(exp)); + // console.log( + // "🚀 ~ file: QueryTablesTabComponent.tsx ~ line 526 ~ QueryTablesTabComponent ~ runQuery ~ newRows", + // filteredItems + // ); + // this.setState({ + // queryText: this.state.queryViewModel.queryText(), + // items: filteredItems, + // }); + // } else { + // this.setState({ + // queryText: this.state.queryViewModel.queryText(), + // items: this.state.originalItems, + // }); + // } + this.setState({ + queryText: this.state.queryViewModel.queryText(), + // items: this.state.originalItems, + }); } public getOperator(operator: string): string { @@ -1055,6 +1073,32 @@ class QueryTablesTabComponent extends Component; + + // case 'name': + // return {fieldContent}; + + // case 'color': + // return ( + // + // {fieldContent} + // + // ); + + // default: + // return {fieldContent}; + // } + // } + render(): JSX.Element { useCommandBar.getState().setContextButtons(this.getTabsButtons()); const { queryTableRows } = this.state; @@ -1257,9 +1301,7 @@ class QueryTablesTabComponent extends Component
- {this.state.items.length === 0 && this.state.isLoading && ( - - )} + {this.state.isLoading && } {this.state.items.length > 0 && !this.state.isLoading && ( )} {this.state.items.length === 0 && !this.state.isLoading && (