Skip to content

Commit 1094409

Browse files
committed
feat(query-builder): set initial expressionsTree and styles adjustments
1 parent aa61684 commit 1094409

File tree

3 files changed

+61
-27
lines changed

3 files changed

+61
-27
lines changed
Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
<div class="wrapper">
2-
<igx-query-builder #queryBuilder
3-
[entities]="entities"
4-
[(expressionTree)]="expressionTree"
5-
(expressionTreeChange)="handleExpressionTreeChange($event)">
6-
</igx-query-builder>
7-
8-
<div class="output-area">
9-
<pre>{{sqlQuery}}</pre>
2+
<div class="container">
3+
<igx-query-builder #queryBuilder
4+
[entities]="entities"
5+
[(expressionTree)]="expressionTree"
6+
(expressionTreeChange)="executeQuery()">
7+
</igx-query-builder>
8+
9+
<div class="output-area">
10+
<pre>{{sqlQuery}}</pre>
11+
</div>
1012
</div>
1113

12-
<igx-grid #grid [data]="gridData" [autoGenerate]="true" height="300px">
14+
<igx-grid #grid [data]="gridData" [autoGenerate]="true" height="270px" [width]="'calc(100% - 40px)'">
1315
</igx-grid>
1416
</div>

src/app/interactions/query-builder/query-builder-sql-sample/query-builder-sql-sample.component.scss

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
.wrapper{
2-
display: flex;
3-
flex-wrap: wrap;
1+
.wrapper {
42
margin: 10px;
53
height: 100%;
64
overflow-y: auto;
75
}
86

7+
.container {
8+
display: flex;
9+
flex-wrap: wrap;
10+
}
11+
912
igx-query-builder {
1013
flex: 1 100px;
1114
}
@@ -24,6 +27,5 @@ igx-query-builder {
2427
}
2528

2629
igx-grid {
27-
flex: 1 750px;
28-
margin: 0 20px 20px 20px;
30+
margin-left: 20px;
2931
}

src/app/interactions/query-builder/query-builder-sql-sample/query-builder-sql-sample.component.ts

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
2-
import { EntityType, FilteringExpressionsTree, IExpressionTree, IgxGridComponent, IgxQueryBuilderComponent } from 'igniteui-angular';
2+
import { EntityType, FilteringExpressionsTree, IExpressionTree, IgxGridComponent, IgxQueryBuilderComponent, IgxStringFilteringOperand } from 'igniteui-angular';
33
import { initDbQuery } from './data-query';
44
import { format } from 'sql-formatter';
55
import initSqlJs from 'sql.js';
@@ -38,13 +38,24 @@ export class QueryBuilderSqlSampleComponent implements OnInit, OnDestroy {
3838
}
3939

4040
public ngOnInit(): void {
41-
this.initializeDbAndEntities();
41+
this.initializeDbAndEntities().then(() => {
42+
this.fetchTablesAndSetEntities();
43+
this.setInitialExpressionTree();
44+
this.executeQuery();
45+
});
4246
}
4347

4448
public ngOnDestroy(): void {
4549
this.db.close();
4650
}
4751

52+
public executeQuery() {
53+
const sqlQuery = this.transformExpressionTreeToSqlQuery(this.expressionTree);
54+
this.sqlQuery = format(sqlQuery);
55+
this.sqlQueryResult = this.db.exec(this.sqlQuery);
56+
this.setGridData();
57+
}
58+
4859
private async initializeDbAndEntities() {
4960
const SQL = await initSqlJs({
5061
locateFile: file => `https://sql.js.org/dist/${file}`
@@ -55,8 +66,9 @@ export class QueryBuilderSqlSampleComponent implements OnInit, OnDestroy {
5566

5667
// create tables and insert data
5768
this.db.run(initDbQuery);
69+
}
5870

59-
71+
private fetchTablesAndSetEntities() {
6072
// get table names with fields and field types
6173
const tables = this.db.exec("SELECT name FROM sqlite_master WHERE type='table'");
6274

@@ -94,14 +106,32 @@ export class QueryBuilderSqlSampleComponent implements OnInit, OnDestroy {
94106
this.entities = entities;
95107
}
96108

97-
public handleExpressionTreeChange(event: IExpressionTree) {
98-
const sqlQuery = this.transformExpressionTreeToSqlQuery(this.queryBuilder.expressionTree);
99-
this.sqlQuery = format(sqlQuery);
100-
this.sqlQueryResult = this.db.exec(this.sqlQuery);
101-
this.setGridData();
109+
private setInitialExpressionTree() {
110+
const categoriesTree = new FilteringExpressionsTree(0, undefined, 'categories', ['category_id']);
111+
categoriesTree.filteringOperands.push({
112+
fieldName: 'category_name',
113+
conditionName: IgxStringFilteringOperand.instance().condition('equals').name,
114+
searchVal: 'Beverages'
115+
});
116+
117+
const productsTree = new FilteringExpressionsTree(0, undefined, 'products', ['supplier_id']);
118+
productsTree.filteringOperands.push({
119+
fieldName: 'category_id',
120+
conditionName: IgxStringFilteringOperand.instance().condition('inQuery').name,
121+
searchTree: categoriesTree
122+
});
123+
124+
const suppliersTree = new FilteringExpressionsTree(0, undefined, 'suppliers', ['*']);
125+
suppliersTree.filteringOperands.push({
126+
fieldName: 'supplier_id',
127+
conditionName: IgxStringFilteringOperand.instance().condition('inQuery').name,
128+
searchTree: productsTree
129+
});
130+
131+
this.expressionTree = suppliersTree;
102132
}
103133

104-
private transformExpressionTreeToSqlQuery(tree: any): string {
134+
private transformExpressionTreeToSqlQuery(tree: IExpressionTree): string {
105135
if (!tree) {
106136
return '';
107137
}
@@ -137,11 +167,13 @@ export class QueryBuilderSqlSampleComponent implements OnInit, OnDestroy {
137167
private buildCondition(operand: any): string {
138168
const field = operand.fieldName;
139169
const value = operand.searchVal;
140-
const condition = operand.condition.name;
170+
const condition = operand.conditionName;
141171

142172
switch (condition) {
143173
case 'equals':
144174
return `${field} = '${value}'`;
175+
case 'doesNotEqual':
176+
return `${field} <> '${value}'`;
145177
case 'contains':
146178
return `${field} LIKE '%${value}%'`;
147179
case 'startsWith':
@@ -156,8 +188,6 @@ export class QueryBuilderSqlSampleComponent implements OnInit, OnDestroy {
156188
return `${field} >= ${value}`;
157189
case 'lessThanOrEqualTo':
158190
return `${field} <= ${value}`;
159-
case 'doesNotEqual':
160-
return `${field} <> ${value}`;
161191
case 'doesNotContain':
162192
return `${field} NOT LIKE '%${value}%'`;
163193
case 'doesNotStartWith':
@@ -168,7 +198,7 @@ export class QueryBuilderSqlSampleComponent implements OnInit, OnDestroy {
168198
return `${field} IS NULL`;
169199
case 'notNull':
170200
return `${field} IS NOT NULL`;
171-
case 'empty':
201+
case 'empty':
172202
return `${field} = ''`;
173203
case 'notEmpty':
174204
return `${field} <> ''`;

0 commit comments

Comments
 (0)