Skip to content

Commit cc8d45b

Browse files
authored
Merge pull request #44 from wsporto/dynamic-query
Dynamic query
2 parents 955dc38 + af96d83 commit cc8d45b

28 files changed

+4243
-100
lines changed

migrations/postgres/V6__seed.sql

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
INSERT INTO mytable1(
2+
value
3+
) VALUES
4+
(1),
5+
(2),
6+
(3),
7+
(4);
8+
9+
INSERT INTO mytable2(
10+
name,
11+
descr
12+
) VALUES
13+
('one', 'descr-one'),
14+
('two', 'descr-two'),
15+
('three', 'descr-three'),
16+
('four', null);
17+
18+
INSERT INTO public.all_types (bool_column,bytea_column,char_column,name_column,int8_column,int2_column,int4_column,text_column,varchar_column,date_column,bit_column,numeric_column,uuid_column,float4_column,float8_column,timestamp_column,timestamp_not_null_column,timestamptz_column,timestamptz_not_null_column) VALUES
19+
(NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2024-12-31 00:00:00',NULL,'2024-12-31 00:00:00-03'),
20+
(NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-01-01 00:00:00',NULL,'2025-01-01 00:00:00-03'),
21+
(NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-01-02 00:00:00',NULL,'2025-01-02 00:00:00-03'),
22+
(NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-01-03 00:00:00',NULL,'2025-01-03 00:00:00-03'),
23+
(NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-02-04 00:00:00',NULL,'2025-02-04 00:00:00-03'),
24+
(NULL,NULL,NULL,NULL,NULL,NULL,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-02-05 00:00:00',NULL,'2025-02-05 00:00:00-03');

src/code-generator2.ts

Lines changed: 285 additions & 20 deletions
Large diffs are not rendered by default.

src/postgres-query-analyzer/describe.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ import { NotNullInfo, PostgresTraverseResult } from './traverse';
1111
import { describeNestedQuery } from '../sqlite-query-analyzer/sqlite-describe-nested-query';
1212
import { isLeft } from 'fp-ts/lib/Either';
1313
import { hasAnnotation } from '../describe-query';
14+
import { describeDynamicQuery2 } from '../describe-dynamic-query';
1415

1516
function describeQueryRefine(sql: string, postgresDescribeResult: PostgresDescribe, dbSchema: PostgresColumnSchema[], namedParameters: string[]): Result<SchemaDef, string> {
1617

17-
const gererateNested = hasAnnotation(sql, '@nested');
18-
// const gererateDynamicQuery = hasAnnotation(sql, '@dynamicQuery');
18+
const generateNestedInfo = hasAnnotation(sql, '@nested');
19+
const generateDynamicQueryInfo = hasAnnotation(sql, '@dynamicQuery');
1920

20-
const parseResult = safeParseSql(sql, dbSchema, gererateNested);
21+
const parseResult = safeParseSql(sql, dbSchema, { collectNestedInfo: generateNestedInfo, collectDynamicQueryInfo: generateDynamicQueryInfo });
2122
if (parseResult.isErr()) {
2223
return err(parseResult.error)
2324
}
@@ -49,6 +50,10 @@ function describeQueryRefine(sql: string, postgresDescribeResult: PostgresDescri
4950
}
5051
descResult.nestedInfo = nestedResult.right;
5152
}
53+
if (traverseResult.dynamicQueryInfo) {
54+
const dynamicSqlQueryInfo = describeDynamicQuery2(traverseResult.dynamicQueryInfo, namedParameters, []);
55+
descResult.dynamicSqlQuery2 = dynamicSqlQueryInfo;
56+
}
5257
return ok(descResult);
5358
}
5459

src/postgres-query-analyzer/parser.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
import { parseSql as _parseSql } from '@wsporto/typesql-parser/postgres';
2-
import { PostgresTraverseResult, traverseSmt } from './traverse';
2+
import { defaultOptions, PostgresTraverseResult, traverseSmt } from './traverse';
33
import { PostgresColumnSchema } from '../drivers/types';
44
import { Result, err, ok } from 'neverthrow';
55

6-
7-
export function parseSql(sql: string, dbSchema: PostgresColumnSchema[], gererateNested = false): PostgresTraverseResult {
6+
export function parseSql(sql: string, dbSchema: PostgresColumnSchema[], options = defaultOptions()): PostgresTraverseResult {
87
const parser = _parseSql(sql);
98

10-
const traverseResult = traverseSmt(parser.stmt(), dbSchema, gererateNested);
9+
const traverseResult = traverseSmt(parser.stmt(), dbSchema, options);
1110

1211
return traverseResult;
1312
}
1413

15-
export function safeParseSql(sql: string, dbSchema: PostgresColumnSchema[], gererateNested: boolean): Result<PostgresTraverseResult, string> {
14+
export function safeParseSql(sql: string, dbSchema: PostgresColumnSchema[], options = defaultOptions()): Result<PostgresTraverseResult, string> {
1615
try {
17-
const result = parseSql(sql, dbSchema, gererateNested);
16+
const result = parseSql(sql, dbSchema, options);
1817
return ok(result);
1918
}
2019
catch (e) {

src/postgres-query-analyzer/traverse.ts

Lines changed: 215 additions & 65 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)