data-finder-ts 0.1.0 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/chunk-3SSWFES4.js +448 -0
  2. package/dist/chunk-3SSWFES4.js.map +1 -0
  3. package/dist/chunk-5K2Z3YDY.js +393 -0
  4. package/dist/chunk-5K2Z3YDY.js.map +1 -0
  5. package/dist/chunk-6QTCGJWX.js +98 -0
  6. package/dist/chunk-6QTCGJWX.js.map +1 -0
  7. package/dist/chunk-DFYZVBII.js +652 -0
  8. package/dist/chunk-DFYZVBII.js.map +1 -0
  9. package/dist/chunk-EYXBYV2X.js +90 -0
  10. package/dist/chunk-EYXBYV2X.js.map +1 -0
  11. package/dist/chunk-FLEIUDZZ.js +14 -0
  12. package/dist/chunk-FLEIUDZZ.js.map +1 -0
  13. package/dist/chunk-V647VNMY.js +135 -0
  14. package/dist/chunk-V647VNMY.js.map +1 -0
  15. package/dist/datafinder/attribute.cjs +269 -0
  16. package/dist/datafinder/attribute.cjs.map +1 -0
  17. package/dist/datafinder/attribute.d.cts +45 -0
  18. package/dist/datafinder/attribute.d.ts +45 -0
  19. package/dist/datafinder/attribute.js +8 -0
  20. package/dist/datafinder/attribute.js.map +1 -0
  21. package/dist/datafinder/finder-registry.cjs +39 -0
  22. package/dist/datafinder/finder-registry.cjs.map +1 -0
  23. package/dist/datafinder/finder-registry.d.cts +4 -0
  24. package/dist/datafinder/finder-registry.d.ts +4 -0
  25. package/dist/datafinder/finder-registry.js +9 -0
  26. package/dist/datafinder/finder-registry.js.map +1 -0
  27. package/dist/datafinder/runner.cjs +1346 -0
  28. package/dist/datafinder/runner.cjs.map +1 -0
  29. package/dist/datafinder/runner.d.cts +33 -0
  30. package/dist/datafinder/runner.d.ts +33 -0
  31. package/dist/datafinder/runner.js +20 -0
  32. package/dist/datafinder/runner.js.map +1 -0
  33. package/dist/datafinder/sql-generator.cjs +1261 -0
  34. package/dist/datafinder/sql-generator.cjs.map +1 -0
  35. package/dist/datafinder/sql-generator.d.cts +17 -0
  36. package/dist/datafinder/sql-generator.d.ts +17 -0
  37. package/dist/datafinder/sql-generator.js +17 -0
  38. package/dist/datafinder/sql-generator.js.map +1 -0
  39. package/dist/datafinder/typed-attributes.cjs +751 -0
  40. package/dist/datafinder/typed-attributes.cjs.map +1 -0
  41. package/dist/datafinder/typed-attributes.d.cts +135 -0
  42. package/dist/datafinder/typed-attributes.d.ts +135 -0
  43. package/dist/datafinder/typed-attributes.js +25 -0
  44. package/dist/datafinder/typed-attributes.js.map +1 -0
  45. package/dist/index.cjs +1822 -0
  46. package/dist/index.cjs.map +1 -0
  47. package/dist/index.d.cts +27 -0
  48. package/dist/index.d.ts +27 -0
  49. package/dist/index.js +159 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/model/milestoning.cjs +145 -0
  52. package/dist/model/milestoning.cjs.map +1 -0
  53. package/dist/model/milestoning.d.cts +40 -0
  54. package/dist/model/milestoning.d.ts +40 -0
  55. package/dist/model/milestoning.js +18 -0
  56. package/dist/model/milestoning.js.map +1 -0
  57. package/dist/model/relational.cjs +514 -0
  58. package/dist/model/relational.cjs.map +1 -0
  59. package/dist/model/relational.d.cts +246 -0
  60. package/dist/model/relational.d.ts +246 -0
  61. package/dist/model/relational.js +91 -0
  62. package/dist/model/relational.js.map +1 -0
  63. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/datafinder/finder.ts","../src/datafinder/sql-generator.ts"],"sourcesContent":["import { RelationalOperationElement, LogicalOperation, LogicalOperator, JoinTreeNodeOperation } from '../model/relational';\n\nexport class ExistsOperation extends RelationalOperationElement {\n constructor(readonly node: JoinTreeNodeOperation) { super(); }\n\n andOp(other: RelationalOperationElement): LogicalOperation {\n return new LogicalOperation(this, LogicalOperator.AND, other);\n }\n}\n\nexport class NotExistsOperation extends RelationalOperationElement {\n constructor(readonly node: JoinTreeNodeOperation) { super(); }\n\n andOp(other: RelationalOperationElement): LogicalOperation {\n return new LogicalOperation(this, LogicalOperator.AND, other);\n }\n}\n\nexport class RelatedFinder {\n constructor(private readonly _node: JoinTreeNodeOperation) {}\n\n exists(): ExistsOperation {\n return new ExistsOperation(this._node);\n }\n\n notExists(): NotExistsOperation {\n return new NotExistsOperation(this._node);\n }\n}\n","import { Attribute } from './attribute';\nimport {\n RelationalOperationElement,\n Operation,\n NoOperation,\n ConstantOperation,\n StringConstantOperation,\n IntegerConstantOperation,\n FloatConstantOperation,\n DateConstantOperation,\n DateTimeConstantOperation,\n BooleanConstantOperation,\n DecimalConstantOperation,\n LogicalOperation,\n LogicalOperator,\n ComparisonOperation,\n ComparisonOperator,\n IsNullOperation,\n IsNotNullOperation,\n AggregateOperation,\n AggregateOperator,\n ScalarFunctionOperation,\n ScalarFunction,\n DateExtractOperation,\n DateArithmeticOperation,\n DateDiffOperation,\n WindowFunction,\n WindowFunctionOperation,\n WindowSpecification,\n Column,\n ColumnWithJoin,\n Table,\n JoinOperation,\n JoinTreeNodeOperation,\n SortOperation,\n SortDirection,\n CountAllOperation,\n UnaryOperation,\n} from '../model/relational';\nimport {\n MilestonedTable,\n BiTemporalColumns,\n BusinessDateAndProcessingTemporalColumns,\n ProcessingTemporalColumns,\n SingleBusinessDateColumn,\n} from '../model/milestoning';\nimport { DateAttribute, DateTimeAttribute } from './typed-attributes';\nimport { ExistsOperation, NotExistsOperation } from './finder';\n\nclass Alias {\n constructor(readonly element: RelationalOperationElement, readonly name: string) {}\n}\n\nclass TableAlias {\n constructor(readonly table: string, readonly alias: string) {}\n}\n\nclass TableAliasColumn extends RelationalOperationElement {\n constructor(readonly column: Column, readonly tableAlias: TableAlias) { super(); }\n}\n\nclass Join {\n constructor(\n readonly source: TableAliasColumn,\n readonly target: TableAliasColumn,\n readonly filterOp?: RelationalOperationElement,\n ) {}\n}\n\nclass SelectOperation {\n constructor(\n readonly display: (Attribute | RelationalOperationElement)[],\n readonly filter: RelationalOperationElement,\n readonly orderBy: SortOperation[] = [],\n readonly groupBy: Attribute[] = [],\n readonly limit?: number,\n readonly table?: Table,\n ) {}\n}\n\nfunction sqlFormatDatetime(value: Date): string {\n const pad = (n: number, w = 2) => String(n).padStart(w, '0');\n return `'${value.getUTCFullYear()}-${pad(value.getUTCMonth() + 1)}-${pad(value.getUTCDate())} ${pad(value.getUTCHours())}:${pad(value.getUTCMinutes())}:${pad(value.getUTCSeconds())}'`;\n}\n\nfunction sqlFormatDate(value: Date): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `'${value.getUTCFullYear()}-${pad(value.getUTCMonth() + 1)}-${pad(value.getUTCDate())}'`;\n}\n\nconst LOGICAL_OPERATOR_STR: Record<LogicalOperator, string> = {\n [LogicalOperator.AND]: ' AND ',\n [LogicalOperator.OR]: ' OR ',\n};\n\nconst COMPARISON_OPERATOR_STR: Record<ComparisonOperator, string> = {\n [ComparisonOperator.EQUAL]: ' = ',\n [ComparisonOperator.NOT_EQUAL]: ' <> ',\n [ComparisonOperator.LESS_THAN]: ' < ',\n [ComparisonOperator.GREATER_THAN]: ' > ',\n [ComparisonOperator.LESS_THAN_OR_EQUAL_TO]: ' <= ',\n [ComparisonOperator.GREATER_THAN_OR_EQUAL_TO]: ' >= ',\n [ComparisonOperator.LIKE]: ' LIKE ',\n [ComparisonOperator.NOT_LIKE]: ' NOT LIKE ',\n};\n\nconst AGGREGATE_SQL_NAMES: Partial<Record<AggregateOperator, string>> = {\n [AggregateOperator.AVERAGE]: 'AVG',\n};\n\nconst WINDOW_SQL_NAMES: Record<WindowFunction, string> = {\n [WindowFunction.ROW_NUMBER]: 'ROW_NUMBER',\n [WindowFunction.RANK]: 'RANK',\n [WindowFunction.DENSE_RANK]: 'DENSE_RANK',\n [WindowFunction.NTILE]: 'NTILE',\n [WindowFunction.LAG]: 'LAG',\n [WindowFunction.LEAD]: 'LEAD',\n [WindowFunction.FIRST_VALUE]: 'FIRST_VALUE',\n [WindowFunction.LAST_VALUE]: 'LAST_VALUE',\n [WindowFunction.CUME_DIST]: 'CUME_DIST',\n [WindowFunction.PERCENT_RANK]: 'PERCENT_RANK',\n};\n\nconst SCALAR_SQL_NAMES: Record<ScalarFunction, string> = {\n [ScalarFunction.ABS]: 'ABS',\n [ScalarFunction.CEILING]: 'CEILING',\n [ScalarFunction.FLOOR]: 'FLOOR',\n [ScalarFunction.MOD]: 'MOD',\n [ScalarFunction.POWER]: 'POWER',\n [ScalarFunction.SQRT]: 'SQRT',\n [ScalarFunction.ROUND]: 'ROUND',\n [ScalarFunction.UPPER]: 'UPPER',\n [ScalarFunction.LOWER]: 'LOWER',\n [ScalarFunction.TRIM]: 'TRIM',\n [ScalarFunction.LTRIM]: 'LTRIM',\n [ScalarFunction.RTRIM]: 'RTRIM',\n [ScalarFunction.LENGTH]: 'LENGTH',\n [ScalarFunction.REVERSE]: 'REVERSE',\n [ScalarFunction.LEFT]: 'LEFT',\n [ScalarFunction.RIGHT]: 'RIGHT',\n [ScalarFunction.REPEAT]: 'REPEAT',\n [ScalarFunction.REPLACE]: 'REPLACE',\n [ScalarFunction.SUBSTRING]: 'SUBSTRING',\n};\n\nfunction constantValueString(op: ConstantOperation): string {\n if (op instanceof StringConstantOperation) return \"'\" + op.value + \"'\";\n if (op instanceof DateConstantOperation) return sqlFormatDate(op.value);\n if (op instanceof DateTimeConstantOperation) return sqlFormatDatetime(op.value);\n if (op instanceof IntegerConstantOperation) return String(op.value);\n if (op instanceof FloatConstantOperation) return String(op.value);\n if (op instanceof BooleanConstantOperation) return op.value ? 'TRUE' : 'FALSE';\n if (op instanceof DecimalConstantOperation) return String(op.value);\n throw new Error('Unknown constant operation');\n}\n\nfunction windowSpecToString(window: WindowSpecification): string {\n const parts: string[] = [];\n if (window.partitionBy.length > 0) {\n parts.push('PARTITION BY ' + window.partitionBy.map(p => sqlOperationToString(p)).join(', '));\n }\n if (window.orderBy.length > 0) {\n parts.push('ORDER BY ' + window.orderBy.map(s =>\n sqlOperationToString(s.column) + (s.direction === SortDirection.ASC ? ' ASC' : ' DESC'),\n ).join(', '));\n }\n return 'OVER (' + parts.join(' ') + ')';\n}\n\nfunction sqlOperationToString(operation: RelationalOperationElement): string {\n if (operation instanceof TableAliasColumn) {\n return operation.tableAlias.alias + '.' + operation.column.name;\n }\n if (operation instanceof WindowFunctionOperation) {\n const fn = WINDOW_SQL_NAMES[operation.func];\n const parts: string[] = [];\n if (operation.element !== null && operation.element !== undefined) {\n parts.push(sqlOperationToString(operation.element));\n }\n if (operation.secondArg !== undefined) parts.push(String(operation.secondArg));\n for (const arg of operation.extraArgs) {\n parts.push(typeof arg === 'string' ? \"'\" + arg + \"'\" : String(arg));\n }\n const sql = fn + '(' + parts.join(', ') + ')';\n return sql + (operation.window !== undefined ? ' ' + windowSpecToString(operation.window) : ' OVER ()');\n }\n if (operation instanceof AggregateOperation) {\n const fn = AGGREGATE_SQL_NAMES[operation.operator] ?? operation.operator;\n let sql = fn + '(' + sqlOperationToString(operation.element) + ')';\n if (operation.window !== undefined) {\n sql += ' ' + windowSpecToString(operation.window);\n }\n return sql;\n }\n if (operation instanceof ScalarFunctionOperation) {\n const fn = SCALAR_SQL_NAMES[operation.func];\n const parts: string[] = [sqlOperationToString(operation.element)];\n if (operation.secondArg !== undefined) parts.push(String(operation.secondArg));\n for (const arg of operation.extraArgs) {\n parts.push(typeof arg === 'string' ? \"'\" + arg + \"'\" : String(arg));\n }\n return fn + '(' + parts.join(', ') + ')';\n }\n if (operation instanceof DateExtractOperation) {\n return 'EXTRACT(' + operation.part + ' FROM ' + sqlOperationToString(operation.element) + ')';\n }\n if (operation instanceof DateArithmeticOperation) {\n const op = operation.isAdd ? '+' : '-';\n return sqlOperationToString(operation.element) + ' ' + op + ' INTERVAL ' + operation.n + ' ' + operation.unit;\n }\n if (operation instanceof DateDiffOperation) {\n const otherSql = sqlFormatDatetime(operation.other);\n return \"DATE_DIFF('\" + operation.unit.toLowerCase() + \"', \" + sqlOperationToString(operation.element) + ', ' + otherSql + ')';\n }\n if (operation instanceof CountAllOperation) return 'COUNT(*)';\n if (operation instanceof Alias) {\n return sqlOperationToString(operation.element) + ' AS \"' + operation.name + '\"';\n }\n throw new TypeError('Unknown operation in sqlOperationToString: ' + operation.constructor.name);\n}\n\nfunction findColumn(operation: RelationalOperationElement): ColumnWithJoin {\n if (operation instanceof UnaryOperation) return findColumn(operation.element);\n if (operation instanceof ColumnWithJoin) return operation;\n throw new TypeError('Cannot find ColumnWithJoin in: ' + operation.constructor.name);\n}\n\nfunction openEndClause(\n endAttr: DateTimeAttribute | DateAttribute,\n value: Date,\n infiniteDatetime?: string,\n): Operation {\n const gtOp = endAttr instanceof DateTimeAttribute ? endAttr.gt(value) : endAttr.gt(value);\n if (infiniteDatetime === undefined) {\n const colRef = new ColumnWithJoin(endAttr.column(), endAttr.parent());\n return new LogicalOperation(gtOp, LogicalOperator.OR, new IsNullOperation(colRef));\n }\n return gtOp;\n}\n\nfunction buildMilestoningFilterOperation(\n businessDate: Date | null,\n processingDatetime: Date | null,\n table: MilestonedTable,\n joinNode?: JoinTreeNodeOperation,\n): Operation | null {\n const mc = table.milestoningColumns;\n const ops: Operation[] = [];\n\n if (mc instanceof BiTemporalColumns) {\n if (businessDate !== null) {\n const dateFrom = new DateAttribute('business_date_from', mc.businessDateFromColumn.name, mc.businessDateFromColumn.type, mc.businessDateFromColumn.table!.qualifiedName, joinNode);\n const dateTo = new DateAttribute('business_date_to', mc.businessDateToColumn.name, mc.businessDateToColumn.type, mc.businessDateToColumn.table!.qualifiedName, joinNode);\n ops.push(new LogicalOperation(dateFrom.lte(businessDate), LogicalOperator.AND, openEndClause(dateTo, businessDate, mc.infiniteDatetime)));\n }\n if (processingDatetime !== null) {\n const startAt = new DateTimeAttribute('start_at', mc.startAtColumn.name, mc.startAtColumn.type, mc.startAtColumn.table!.qualifiedName, joinNode);\n const endAt = new DateTimeAttribute('end_at', mc.endAtColumn.name, mc.endAtColumn.type, mc.endAtColumn.table!.qualifiedName, joinNode);\n ops.push(new LogicalOperation(startAt.lte(processingDatetime), LogicalOperator.AND, openEndClause(endAt, processingDatetime, mc.infiniteDatetime)));\n }\n } else if (mc instanceof BusinessDateAndProcessingTemporalColumns) {\n if (businessDate !== null) {\n const businessAtt = new DateAttribute('business_date', mc.businessDateColumn.name, mc.businessDateColumn.type, mc.businessDateColumn.table!.qualifiedName, joinNode);\n ops.push(businessAtt.eq(businessDate));\n }\n if (processingDatetime !== null) {\n const startAt = new DateTimeAttribute('start_at', mc.startAtColumn.name, mc.startAtColumn.type, mc.startAtColumn.table!.qualifiedName, joinNode);\n const endAt = new DateTimeAttribute('end_at', mc.endAtColumn.name, mc.endAtColumn.type, mc.endAtColumn.table!.qualifiedName, joinNode);\n ops.push(new LogicalOperation(startAt.lte(processingDatetime), LogicalOperator.AND, openEndClause(endAt, processingDatetime, mc.infiniteDatetime)));\n }\n } else if (mc instanceof ProcessingTemporalColumns && processingDatetime !== null) {\n const startAt = new DateTimeAttribute('start_at', mc.startAtColumn.name, mc.startAtColumn.type, mc.startAtColumn.table!.qualifiedName, joinNode);\n const endAt = new DateTimeAttribute('end_at', mc.endAtColumn.name, mc.endAtColumn.type, mc.endAtColumn.table!.qualifiedName, joinNode);\n ops.push(new LogicalOperation(startAt.lte(processingDatetime), LogicalOperator.AND, openEndClause(endAt, processingDatetime, mc.infiniteDatetime)));\n } else if (mc instanceof SingleBusinessDateColumn && businessDate !== null) {\n const businessAtt = new DateAttribute('business_date', mc.businessDateColumn.name, mc.businessDateColumn.type, mc.businessDateColumn.table!.qualifiedName, joinNode);\n ops.push(businessAtt.eq(businessDate));\n }\n\n if (ops.length === 0) return null;\n if (ops.length === 1) return ops[0];\n return new LogicalOperation(ops[0], LogicalOperator.AND, ops[1]);\n}\n\nfunction buildQueryOperation(\n businessDate: Date | null,\n processingDatetime: Date | null,\n columns: (Attribute | RelationalOperationElement)[],\n table: Table,\n op: RelationalOperationElement,\n orderBy: SortOperation[] = [],\n groupBy: Attribute[] = [],\n limit?: number,\n): SelectOperation {\n let filter = op;\n\n if (table instanceof MilestonedTable) {\n const milestonedOp = buildMilestoningFilterOperation(businessDate, processingDatetime, table);\n if (milestonedOp !== null) {\n filter = filter instanceof NoOperation\n ? milestonedOp\n : new LogicalOperation(filter, LogicalOperator.AND, milestonedOp);\n }\n }\n\n const requiredJoins: JoinTreeNodeOperation[] = [];\n const requiredJoinIds = new Set<JoinTreeNodeOperation>();\n\n for (const col of columns) {\n if (col instanceof CountAllOperation) continue;\n let node: JoinTreeNodeOperation | undefined;\n if (col instanceof Attribute) {\n node = col.parent();\n } else {\n node = findColumn(col as RelationalOperationElement).parent;\n }\n if (node !== undefined && !requiredJoinIds.has(node)) {\n requiredJoinIds.add(node);\n requiredJoins.push(node);\n }\n }\n\n for (const node of requiredJoins) {\n if (node.join.target instanceof MilestonedTable) {\n const milestonedOp = buildMilestoningFilterOperation(businessDate, processingDatetime, node.join.target, node);\n if (milestonedOp !== null) {\n node.join.filter = milestonedOp;\n }\n }\n }\n\n return new SelectOperation(columns, filter, orderBy, groupBy, limit, table);\n}\n\nclass SQLQueryGenerator {\n private _select: Alias[] = [];\n private _from: Set<TableAlias> = new Set();\n private _join: Join[] = [];\n private _groupByParts: string[] = [];\n private _orderByParts: string[] = [];\n private _where = '';\n private _limit?: number;\n private _tableAliasIncr = 0;\n private _tableAliasesByTable = new Map<unknown, TableAlias>();\n private _addedJoinIds = new Set<JoinTreeNodeOperation>();\n private _rootTable?: Table;\n\n generate(select: SelectOperation): void {\n this._rootTable = select.table;\n if (this._rootTable !== undefined) {\n this._from.add(this._tableAliasForTable(this._rootTable.qualifiedName, this._rootTable.qualifiedName));\n }\n this.processSelect(select.display);\n this._where = this.buildFilter(select.filter);\n const groupByJoins = new Map<JoinTreeNodeOperation, JoinTreeNodeOperation>();\n for (const expr of select.groupBy) {\n this._collectRequiredJoins(expr, groupByJoins);\n }\n for (const node of groupByJoins.values()) {\n this._addJoin(node);\n }\n this._groupByParts = select.groupBy.map(a => this._attrToColString(a));\n this._orderByParts = select.orderBy.map(s =>\n this.buildFilter(s.column) + (s.direction === SortDirection.ASC ? ' ASC' : ' DESC'),\n );\n this._limit = select.limit;\n }\n\n private _attrToColString(attr: Attribute): string {\n const node = attr.parent();\n const ta = this._tableAliasForTable(attr.owner(), node ?? attr.owner());\n return ta.alias + '.' + attr.column().name;\n }\n\n private _collectRequiredJoins(op: RelationalOperationElement | null | undefined, out: Map<JoinTreeNodeOperation, JoinTreeNodeOperation>): void {\n if (op === null || op === undefined) return;\n if (op instanceof Attribute) {\n const p = op.parent();\n if (p !== undefined) out.set(p, p);\n } else if (op instanceof ColumnWithJoin) {\n if (op.parent !== undefined) out.set(op.parent, op.parent);\n } else if (op instanceof AggregateOperation) {\n this._collectRequiredJoins(op.element, out);\n if (op.window) this._collectRequiredJoins(op.window as unknown as RelationalOperationElement, out);\n } else if (op instanceof WindowFunctionOperation) {\n if (op.element) this._collectRequiredJoins(op.element, out);\n if (op.window) this._collectRequiredJoinsFromWindowSpec(op.window, out);\n } else if (op instanceof ScalarFunctionOperation || op instanceof DateExtractOperation ||\n op instanceof DateArithmeticOperation || op instanceof DateDiffOperation) {\n this._collectRequiredJoins((op as UnaryOperation).element, out);\n } else if (op instanceof SortOperation) {\n this._collectRequiredJoins(op.column, out);\n } else if (op instanceof LogicalOperation || op instanceof ComparisonOperation) {\n this._collectRequiredJoins((op as any).left, out);\n this._collectRequiredJoins((op as any).right, out);\n }\n }\n\n private _collectRequiredJoinsFromWindowSpec(window: WindowSpecification, out: Map<JoinTreeNodeOperation, JoinTreeNodeOperation>): void {\n for (const p of window.partitionBy) {\n this._collectRequiredJoins(p, out);\n }\n for (const s of window.orderBy) {\n this._collectRequiredJoins(s.column, out);\n }\n }\n\n private _rewriteWindowSpec(window: WindowSpecification): WindowSpecification {\n const partitionBy = window.partitionBy.map(p => this._rewriteOperation(p));\n const orderBy = window.orderBy.map(s => new SortOperation(this._rewriteOperation(s.column) as ColumnWithJoin, s.direction));\n return new WindowSpecification(partitionBy, orderBy);\n }\n\n private _rewriteOperation(op: RelationalOperationElement): RelationalOperationElement {\n if (op instanceof Attribute) {\n const ta = this._tableAliasForTable(op.owner(), op.parent() ?? op.owner());\n return new TableAliasColumn(op.column(), ta);\n }\n if (op instanceof ColumnWithJoin) {\n const ta = op.parent !== undefined\n ? this._tableAliasForTable(op.column.owner!, op.parent)\n : this._tableAliasForTable(op.column.owner!, op.column.owner!);\n return new TableAliasColumn(op.column, ta);\n }\n if (op instanceof Column) {\n const ta = this._tableAliasForTable(op.owner!, op.owner!);\n return new TableAliasColumn(op, ta);\n }\n if (op instanceof AggregateOperation) {\n return new AggregateOperation(\n this._rewriteOperation(op.element), op.operator, op.displayName,\n op.window ? this._rewriteWindowSpec(op.window) : undefined,\n );\n }\n if (op instanceof WindowFunctionOperation) {\n const el = op.element ? this._rewriteOperation(op.element) : null;\n return new WindowFunctionOperation(el, op.func, op.displayName, op.secondArg, [...op.extraArgs],\n op.window ? this._rewriteWindowSpec(op.window) : undefined);\n }\n if (op instanceof ScalarFunctionOperation) {\n return new ScalarFunctionOperation(this._rewriteOperation(op.element), op.func, op.displayName, op.secondArg, op.extraArgs);\n }\n if (op instanceof DateExtractOperation) {\n return new DateExtractOperation(this._rewriteOperation(op.element), op.part, op.displayName);\n }\n if (op instanceof DateArithmeticOperation) {\n return new DateArithmeticOperation(this._rewriteOperation(op.element), op.n, op.unit, op.isAdd, op.displayName);\n }\n if (op instanceof DateDiffOperation) {\n return new DateDiffOperation(this._rewriteOperation(op.element), (op as DateDiffOperation).other, (op as DateDiffOperation).unit, op.displayName);\n }\n return op;\n }\n\n private processSelect(cols: (Attribute | RelationalOperationElement)[]): void {\n const requiredJoins = new Map<JoinTreeNodeOperation, JoinTreeNodeOperation>();\n\n for (const col of cols) {\n this._collectRequiredJoins(col, requiredJoins);\n }\n for (const node of requiredJoins.values()) {\n this._addJoin(node);\n }\n\n for (const col of cols) {\n if (col instanceof Attribute) {\n const node = col.parent();\n let ta: TableAlias;\n if (node !== undefined) {\n ta = this._tableAliasForTable(col.owner(), node);\n } else {\n ta = this._tableAliasForTable(col.owner(), col.owner());\n this._from.add(ta);\n }\n this._select.push(new Alias(new TableAliasColumn(col.column(), ta), col.displayName()));\n } else if (col instanceof WindowFunctionOperation) {\n const rewritten = this._rewriteOperation(col) as WindowFunctionOperation;\n let alias: string;\n if (col.displayName) {\n alias = col.displayName;\n } else if ([WindowFunction.ROW_NUMBER, WindowFunction.RANK, WindowFunction.DENSE_RANK].includes(col.func)) {\n alias = col.func.replace(/_/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase());\n } else if (col.element) {\n alias = col.func + ' ' + findColumn(col).column.name;\n } else {\n alias = col.func;\n }\n this._select.push(new Alias(rewritten, alias));\n } else if (col instanceof AggregateOperation) {\n const colNested = findColumn(col);\n const node = colNested.parent;\n let ta: TableAlias;\n if (node !== undefined) {\n ta = this._tableAliasForTable(colNested.column.owner!, node);\n } else {\n ta = this._tableAliasForTable(colNested.column.owner!, colNested.column.owner!);\n this._from.add(ta);\n }\n const alias = col.displayName ?? col.operator + ' ' + colNested.column.name;\n const rewrittenAgg = new AggregateOperation(\n new TableAliasColumn(colNested.column, ta), col.operator, undefined,\n col.window ? this._rewriteWindowSpec(col.window) : undefined,\n );\n this._select.push(new Alias(rewrittenAgg, alias));\n } else if (col instanceof ScalarFunctionOperation) {\n const colNested = findColumn(col);\n const node = colNested.parent;\n let ta: TableAlias;\n if (node !== undefined) {\n ta = this._tableAliasForTable(colNested.column.owner!, node);\n } else {\n ta = this._tableAliasForTable(colNested.column.owner!, colNested.column.owner!);\n this._from.add(ta);\n }\n const alias = col.displayName ?? col.func + ' ' + colNested.column.name;\n this._select.push(new Alias(\n new ScalarFunctionOperation(new TableAliasColumn(colNested.column, ta), col.func, undefined, col.secondArg, col.extraArgs),\n alias,\n ));\n } else if (col instanceof DateExtractOperation || col instanceof DateArithmeticOperation || col instanceof DateDiffOperation) {\n const colNested = findColumn(col as RelationalOperationElement);\n const node = colNested.parent;\n let ta: TableAlias;\n if (node !== undefined) {\n ta = this._tableAliasForTable(colNested.column.owner!, node);\n } else {\n ta = this._tableAliasForTable(colNested.column.owner!, colNested.column.owner!);\n this._from.add(ta);\n }\n const alias = (col as DateExtractOperation).displayName ?? colNested.column.name;\n let aliasedOp: RelationalOperationElement;\n if (col instanceof DateExtractOperation) {\n aliasedOp = new DateExtractOperation(new TableAliasColumn(colNested.column, ta), col.part);\n } else if (col instanceof DateArithmeticOperation) {\n aliasedOp = new DateArithmeticOperation(new TableAliasColumn(colNested.column, ta), col.n, col.unit, col.isAdd);\n } else {\n aliasedOp = new DateDiffOperation(new TableAliasColumn(colNested.column, ta), (col as DateDiffOperation).other, (col as DateDiffOperation).unit);\n }\n this._select.push(new Alias(aliasedOp, alias));\n } else if (col instanceof CountAllOperation) {\n const ta = this._tableAliasForTable(col.table, col.table);\n this._from.add(ta);\n this._select.push(new Alias(col, 'Count'));\n }\n }\n }\n\n private _addJoin(node: JoinTreeNodeOperation): void {\n if (this._addedJoinIds.has(node)) return;\n if (node.parent !== undefined) this._addJoin(node.parent);\n this._addedJoinIds.add(node);\n\n const join = node.join;\n const left = join.left;\n const srcTa = this._tableAliasForTable(left.owner!, node.parent ?? left.owner!);\n if (node.parent === undefined) this._from.add(srcTa);\n const sc = new TableAliasColumn(left, srcTa);\n const right = join.right;\n const tc = new TableAliasColumn(right, this._tableAliasForTable(right.owner!, node));\n this._join.push(new Join(sc, tc, join.filter));\n }\n\n buildFilter(op: RelationalOperationElement): string {\n if (op instanceof NoOperation) return '';\n if (op instanceof ExistsOperation) {\n const col = op.node.join.right;\n return this.buildFilter(new ColumnWithJoin(col, op.node)) + ' IS NOT NULL';\n }\n if (op instanceof NotExistsOperation) {\n const col = op.node.join.right;\n return this.buildFilter(new ColumnWithJoin(col, op.node)) + ' IS NULL';\n }\n if (op instanceof IsNotNullOperation) return this.buildFilter(op.element) + ' IS NOT NULL';\n if (op instanceof IsNullOperation) return this.buildFilter(op.element) + ' IS NULL';\n if (op instanceof LogicalOperation) {\n let left = this.buildFilter(op.left);\n let right = this.buildFilter(op.right);\n if (op.left instanceof LogicalOperation) left = '(' + left + ')';\n if (op.right instanceof LogicalOperation) right = '(' + right + ')';\n return left + LOGICAL_OPERATOR_STR[op.operator] + right;\n }\n if (op instanceof ComparisonOperation) {\n return this.buildFilter(op.left) + COMPARISON_OPERATOR_STR[op.operator] + this.buildFilter(op.right);\n }\n if (op instanceof ConstantOperation) return constantValueString(op);\n if (op instanceof ColumnWithJoin) {\n const node = op.parent;\n let ta: TableAlias;\n if (node !== undefined) {\n ta = this._tableAliasForTable(op.column.owner!, node);\n this._addJoin(node);\n } else {\n ta = this._tableAliasForTable(op.column.owner!, op.column.owner!);\n }\n return ta.alias + '.' + op.column.name;\n }\n if (op instanceof Column) {\n const ta = this._tableAliasForTable(op.owner!, op.owner!);\n return ta.alias + '.' + op.name;\n }\n throw new Error('Unknown operation in buildFilter: ' + op.constructor.name);\n }\n\n private _tableAliasForTable(table: string, key: unknown): TableAlias {\n if (this._tableAliasesByTable.has(key)) {\n return this._tableAliasesByTable.get(key)!;\n }\n const ta = new TableAlias(table, 't' + this._tableAliasIncr++);\n this._tableAliasesByTable.set(key, ta);\n return ta;\n }\n\n buildQueryString(): string {\n const joins = this._join.map(j =>\n ' LEFT OUTER JOIN ' + j.target.tableAlias.table + ' AS ' + j.target.tableAlias.alias +\n ' ON ' + j.source.tableAlias.alias + '.' + j.source.column.name +\n ' = ' + j.target.tableAlias.alias + '.' + j.target.column.name +\n (j.filterOp ? ' AND ' + this.buildFilter(j.filterOp) : ''),\n );\n\n return 'SELECT ' + this._select.map(ca => sqlOperationToString(ca)).join(',') +\n ' FROM ' + Array.from(this._from).map(ta => ta.table + ' AS ' + ta.alias).join(',') +\n joins.join('') +\n this._buildWhere() +\n this._buildGroupBy() +\n this._buildOrderBy() +\n this._buildLimit();\n }\n\n private _buildWhere(): string {\n return this._where.length > 0 ? ' WHERE ' + this._where : '';\n }\n private _buildGroupBy(): string {\n return this._groupByParts.length > 0 ? ' GROUP BY ' + this._groupByParts.join(', ') : '';\n }\n private _buildOrderBy(): string {\n return this._orderByParts.length > 0 ? ' ORDER BY ' + this._orderByParts.join(', ') : '';\n }\n private _buildLimit(): string {\n return this._limit !== undefined ? ' LIMIT ' + this._limit : '';\n }\n}\n\nexport function selectSqlToString(selectOperation: SelectOperation): string {\n const qg = new SQLQueryGenerator();\n qg.generate(selectOperation);\n return qg.buildQueryString();\n}\n\nexport function toSql(\n businessDate: Date | null,\n processingDatetime: Date | null,\n columns: (Attribute | RelationalOperationElement)[],\n table: Table,\n op: RelationalOperationElement,\n orderBy: SortOperation[] = [],\n groupBy: Attribute[] = [],\n limit?: number,\n): string {\n const selectOp = buildQueryOperation(businessDate, processingDatetime, columns, table, op, orderBy, groupBy, limit);\n return selectSqlToString(selectOp);\n}\n\nexport { buildQueryOperation, SelectOperation };\n"],"mappings":"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","names":[]}
@@ -0,0 +1,90 @@
1
+ import {
2
+ Table
3
+ } from "./chunk-3SSWFES4.js";
4
+
5
+ // src/model/milestoning.ts
6
+ var MilestoningColumns = class {
7
+ };
8
+ var ProcessingTemporalColumns = class extends MilestoningColumns {
9
+ constructor(startAtColumn, endAtColumn, infiniteDatetime) {
10
+ super();
11
+ this.startAtColumn = startAtColumn;
12
+ this.endAtColumn = endAtColumn;
13
+ this.infiniteDatetime = infiniteDatetime;
14
+ }
15
+ startAtColumn;
16
+ endAtColumn;
17
+ infiniteDatetime;
18
+ columns() {
19
+ return [this.startAtColumn, this.endAtColumn];
20
+ }
21
+ };
22
+ var SingleBusinessDateColumn = class extends MilestoningColumns {
23
+ constructor(businessDateColumn) {
24
+ super();
25
+ this.businessDateColumn = businessDateColumn;
26
+ }
27
+ businessDateColumn;
28
+ columns() {
29
+ return [this.businessDateColumn];
30
+ }
31
+ };
32
+ var BusinessDateAndProcessingTemporalColumns = class extends MilestoningColumns {
33
+ constructor(businessDateColumn, startAtColumn, endAtColumn, infiniteDatetime) {
34
+ super();
35
+ this.businessDateColumn = businessDateColumn;
36
+ this.startAtColumn = startAtColumn;
37
+ this.endAtColumn = endAtColumn;
38
+ this.infiniteDatetime = infiniteDatetime;
39
+ }
40
+ businessDateColumn;
41
+ startAtColumn;
42
+ endAtColumn;
43
+ infiniteDatetime;
44
+ columns() {
45
+ return [this.businessDateColumn, this.startAtColumn, this.endAtColumn];
46
+ }
47
+ };
48
+ var BiTemporalColumns = class extends MilestoningColumns {
49
+ constructor(businessDateFromColumn, businessDateToColumn, startAtColumn, endAtColumn, infiniteDatetime) {
50
+ super();
51
+ this.businessDateFromColumn = businessDateFromColumn;
52
+ this.businessDateToColumn = businessDateToColumn;
53
+ this.startAtColumn = startAtColumn;
54
+ this.endAtColumn = endAtColumn;
55
+ this.infiniteDatetime = infiniteDatetime;
56
+ }
57
+ businessDateFromColumn;
58
+ businessDateToColumn;
59
+ startAtColumn;
60
+ endAtColumn;
61
+ infiniteDatetime;
62
+ columns() {
63
+ return [
64
+ this.businessDateFromColumn,
65
+ this.businessDateToColumn,
66
+ this.startAtColumn,
67
+ this.endAtColumn
68
+ ];
69
+ }
70
+ };
71
+ var MilestonedTable = class extends Table {
72
+ constructor(name, columns, milestoningColumns, schema) {
73
+ super(name, columns, schema);
74
+ this.milestoningColumns = milestoningColumns;
75
+ for (const col of milestoningColumns.columns()) {
76
+ col.table = this;
77
+ }
78
+ }
79
+ milestoningColumns;
80
+ };
81
+
82
+ export {
83
+ MilestoningColumns,
84
+ ProcessingTemporalColumns,
85
+ SingleBusinessDateColumn,
86
+ BusinessDateAndProcessingTemporalColumns,
87
+ BiTemporalColumns,
88
+ MilestonedTable
89
+ };
90
+ //# sourceMappingURL=chunk-EYXBYV2X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/model/milestoning.ts"],"sourcesContent":["import { Column, Table, Schema } from './relational';\n\nexport abstract class MilestoningColumns {\n abstract columns(): Column[];\n}\n\nexport class ProcessingTemporalColumns extends MilestoningColumns {\n constructor(\n readonly startAtColumn: Column,\n readonly endAtColumn: Column,\n readonly infiniteDatetime?: string,\n ) { super(); }\n\n columns(): Column[] { return [this.startAtColumn, this.endAtColumn]; }\n}\n\nexport class SingleBusinessDateColumn extends MilestoningColumns {\n constructor(readonly businessDateColumn: Column) { super(); }\n\n columns(): Column[] { return [this.businessDateColumn]; }\n}\n\nexport class BusinessDateAndProcessingTemporalColumns extends MilestoningColumns {\n constructor(\n readonly businessDateColumn: Column,\n readonly startAtColumn: Column,\n readonly endAtColumn: Column,\n readonly infiniteDatetime?: string,\n ) { super(); }\n\n columns(): Column[] {\n return [this.businessDateColumn, this.startAtColumn, this.endAtColumn];\n }\n}\n\nexport class BiTemporalColumns extends MilestoningColumns {\n constructor(\n readonly businessDateFromColumn: Column,\n readonly businessDateToColumn: Column,\n readonly startAtColumn: Column,\n readonly endAtColumn: Column,\n readonly infiniteDatetime?: string,\n ) { super(); }\n\n columns(): Column[] {\n return [\n this.businessDateFromColumn,\n this.businessDateToColumn,\n this.startAtColumn,\n this.endAtColumn,\n ];\n }\n}\n\nexport class MilestonedTable extends Table {\n constructor(\n name: string,\n columns: Column[],\n readonly milestoningColumns: MilestoningColumns,\n schema?: Schema,\n ) {\n super(name, columns, schema);\n for (const col of milestoningColumns.columns()) {\n col.table = this;\n }\n }\n}\n"],"mappings":";;;;;AAEO,IAAe,qBAAf,MAAkC;AAEzC;AAEO,IAAM,4BAAN,cAAwC,mBAAmB;AAAA,EAChE,YACW,eACA,aACA,kBACT;AAAE,UAAM;AAHC;AACA;AACA;AAAA,EACE;AAAA,EAHF;AAAA,EACA;AAAA,EACA;AAAA,EAGX,UAAoB;AAAE,WAAO,CAAC,KAAK,eAAe,KAAK,WAAW;AAAA,EAAG;AACvE;AAEO,IAAM,2BAAN,cAAuC,mBAAmB;AAAA,EAC/D,YAAqB,oBAA4B;AAAE,UAAM;AAApC;AAAA,EAAuC;AAAA,EAAvC;AAAA,EAErB,UAAoB;AAAE,WAAO,CAAC,KAAK,kBAAkB;AAAA,EAAG;AAC1D;AAEO,IAAM,2CAAN,cAAuD,mBAAmB;AAAA,EAC/E,YACW,oBACA,eACA,aACA,kBACT;AAAE,UAAM;AAJC;AACA;AACA;AACA;AAAA,EACE;AAAA,EAJF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGX,UAAoB;AAClB,WAAO,CAAC,KAAK,oBAAoB,KAAK,eAAe,KAAK,WAAW;AAAA,EACvE;AACF;AAEO,IAAM,oBAAN,cAAgC,mBAAmB;AAAA,EACxD,YACW,wBACA,sBACA,eACA,aACA,kBACT;AAAE,UAAM;AALC;AACA;AACA;AACA;AACA;AAAA,EACE;AAAA,EALF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGX,UAAoB;AAClB,WAAO;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAEO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACE,MACA,SACS,oBACT,QACA;AACA,UAAM,MAAM,SAAS,MAAM;AAHlB;AAIT,eAAW,OAAO,mBAAmB,QAAQ,GAAG;AAC9C,UAAI,QAAQ;AAAA,IACd;AAAA,EACF;AAAA,EAPW;AAQb;","names":[]}
@@ -0,0 +1,14 @@
1
+ // src/datafinder/finder-registry.ts
2
+ var _registry = /* @__PURE__ */ new Map();
3
+ function registerRelatedFinderClass(name, cls) {
4
+ _registry.set(name, cls);
5
+ }
6
+ function getRelatedFinderClass(name) {
7
+ return _registry.get(name);
8
+ }
9
+
10
+ export {
11
+ registerRelatedFinderClass,
12
+ getRelatedFinderClass
13
+ };
14
+ //# sourceMappingURL=chunk-FLEIUDZZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/datafinder/finder-registry.ts"],"sourcesContent":["const _registry = new Map<string, new (...args: any[]) => unknown>();\n\nexport function registerRelatedFinderClass(name: string, cls: new (...args: any[]) => unknown): void {\n _registry.set(name, cls);\n}\n\nexport function getRelatedFinderClass(name: string): (new (...args: any[]) => unknown) | undefined {\n return _registry.get(name);\n}\n"],"mappings":";AAAA,IAAM,YAAY,oBAAI,IAA6C;AAE5D,SAAS,2BAA2B,MAAc,KAA4C;AACnG,YAAU,IAAI,MAAM,GAAG;AACzB;AAEO,SAAS,sBAAsB,MAA6D;AACjG,SAAO,UAAU,IAAI,IAAI;AAC3B;","names":[]}
@@ -0,0 +1,135 @@
1
+ import {
2
+ AggregateOperation,
3
+ Column,
4
+ ColumnWithJoin,
5
+ IsNotNullOperation,
6
+ IsNullOperation,
7
+ SortOperation,
8
+ WindowFunctionOperation,
9
+ WindowSpecification
10
+ } from "./chunk-3SSWFES4.js";
11
+
12
+ // src/datafinder/attribute.ts
13
+ var Attribute = class {
14
+ _displayName;
15
+ _column;
16
+ _owner;
17
+ _parent;
18
+ constructor(displayName, columnName, columnDbType, owner, parent) {
19
+ this._displayName = displayName;
20
+ this._column = new Column(columnName, columnDbType, owner);
21
+ this._owner = owner;
22
+ this._parent = parent;
23
+ }
24
+ column() {
25
+ return this._column;
26
+ }
27
+ owner() {
28
+ return this._owner;
29
+ }
30
+ parent() {
31
+ return this._parent;
32
+ }
33
+ displayName() {
34
+ return this._displayName;
35
+ }
36
+ cwj() {
37
+ return new ColumnWithJoin(this._column, this._parent);
38
+ }
39
+ count() {
40
+ return new AggregateOperation(
41
+ new ColumnWithJoin(this._column, this._parent),
42
+ "COUNT" /* COUNT */,
43
+ this._displayName + " Count"
44
+ );
45
+ }
46
+ ascending() {
47
+ return new SortOperation(new ColumnWithJoin(this._column, this._parent), "ASC" /* ASC */);
48
+ }
49
+ descending() {
50
+ return new SortOperation(new ColumnWithJoin(this._column, this._parent), "DESC" /* DESC */);
51
+ }
52
+ isNull() {
53
+ return new IsNullOperation(new ColumnWithJoin(this._column, this._parent));
54
+ }
55
+ isNotNull() {
56
+ return new IsNotNullOperation(new ColumnWithJoin(this._column, this._parent));
57
+ }
58
+ _windowSpec(partitionBy, orderBy) {
59
+ const pb = partitionBy === void 0 ? [] : Array.isArray(partitionBy) ? partitionBy : [partitionBy];
60
+ const ob = orderBy === void 0 ? [] : Array.isArray(orderBy) ? orderBy : [orderBy];
61
+ return new WindowSpecification(pb, ob);
62
+ }
63
+ rank(opts = {}) {
64
+ const { method = "min", pct = false, partitionBy, orderBy } = opts;
65
+ let func;
66
+ let name;
67
+ if (pct) {
68
+ if (method === "max") {
69
+ func = "CUME_DIST" /* CUME_DIST */;
70
+ name = "Cume Dist";
71
+ } else {
72
+ func = "PERCENT_RANK" /* PERCENT_RANK */;
73
+ name = "Percent Rank";
74
+ }
75
+ } else if (method === "first") {
76
+ func = "ROW_NUMBER" /* ROW_NUMBER */;
77
+ name = "Row Number";
78
+ } else if (method === "dense") {
79
+ func = "DENSE_RANK" /* DENSE_RANK */;
80
+ name = "Dense Rank";
81
+ } else {
82
+ func = "RANK" /* RANK */;
83
+ name = "Rank";
84
+ }
85
+ return new WindowFunctionOperation(null, func, name, void 0, [], this._windowSpec(partitionBy, orderBy));
86
+ }
87
+ qcut(buckets, opts = {}) {
88
+ return new WindowFunctionOperation(
89
+ null,
90
+ "NTILE" /* NTILE */,
91
+ "Quantile",
92
+ buckets,
93
+ [],
94
+ this._windowSpec(opts.partitionBy, opts.orderBy)
95
+ );
96
+ }
97
+ shift(periods = 1, opts = {}) {
98
+ const extraArgs = opts.fillValue !== void 0 ? [opts.fillValue] : [];
99
+ const func = periods >= 0 ? "LAG" /* LAG */ : "LEAD" /* LEAD */;
100
+ const label = periods >= 0 ? "Lag" : "Lead";
101
+ return new WindowFunctionOperation(
102
+ new ColumnWithJoin(this._column, this._parent),
103
+ func,
104
+ label + " " + this._displayName,
105
+ Math.abs(periods),
106
+ extraArgs,
107
+ this._windowSpec(opts.partitionBy, opts.orderBy)
108
+ );
109
+ }
110
+ first(opts = {}) {
111
+ return new WindowFunctionOperation(
112
+ new ColumnWithJoin(this._column, this._parent),
113
+ "FIRST_VALUE" /* FIRST_VALUE */,
114
+ "First " + this._displayName,
115
+ void 0,
116
+ [],
117
+ this._windowSpec(opts.partitionBy, opts.orderBy)
118
+ );
119
+ }
120
+ last(opts = {}) {
121
+ return new WindowFunctionOperation(
122
+ new ColumnWithJoin(this._column, this._parent),
123
+ "LAST_VALUE" /* LAST_VALUE */,
124
+ "Last " + this._displayName,
125
+ void 0,
126
+ [],
127
+ this._windowSpec(opts.partitionBy, opts.orderBy)
128
+ );
129
+ }
130
+ };
131
+
132
+ export {
133
+ Attribute
134
+ };
135
+ //# sourceMappingURL=chunk-V647VNMY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/datafinder/attribute.ts"],"sourcesContent":["import {\n Column,\n AggregateOperation,\n AggregateOperator,\n ColumnWithJoin,\n SortOperation,\n SortDirection,\n IsNullOperation,\n IsNotNullOperation,\n JoinTreeNodeOperation,\n WindowFunction,\n WindowFunctionOperation,\n WindowSpecification,\n} from '../model/relational';\n\nexport abstract class Attribute {\n private readonly _displayName: string;\n private readonly _column: Column;\n private readonly _owner: string;\n private readonly _parent?: JoinTreeNodeOperation;\n\n constructor(\n displayName: string,\n columnName: string,\n columnDbType: string,\n owner: string,\n parent?: JoinTreeNodeOperation,\n ) {\n this._displayName = displayName;\n this._column = new Column(columnName, columnDbType, owner);\n this._owner = owner;\n this._parent = parent;\n }\n\n column(): Column { return this._column; }\n owner(): string { return this._owner; }\n parent(): JoinTreeNodeOperation | undefined { return this._parent; }\n displayName(): string { return this._displayName; }\n\n cwj(): ColumnWithJoin {\n return new ColumnWithJoin(this._column, this._parent);\n }\n\n count(): AggregateOperation {\n return new AggregateOperation(\n new ColumnWithJoin(this._column, this._parent),\n AggregateOperator.COUNT,\n this._displayName + ' Count',\n );\n }\n\n ascending(): SortOperation {\n return new SortOperation(new ColumnWithJoin(this._column, this._parent), SortDirection.ASC);\n }\n\n descending(): SortOperation {\n return new SortOperation(new ColumnWithJoin(this._column, this._parent), SortDirection.DESC);\n }\n\n isNull(): IsNullOperation {\n return new IsNullOperation(new ColumnWithJoin(this._column, this._parent));\n }\n\n isNotNull(): IsNotNullOperation {\n return new IsNotNullOperation(new ColumnWithJoin(this._column, this._parent));\n }\n\n private _windowSpec(\n partitionBy?: ColumnWithJoin | ColumnWithJoin[],\n orderBy?: SortOperation | SortOperation[],\n ): WindowSpecification {\n const pb = partitionBy === undefined ? [] : Array.isArray(partitionBy) ? partitionBy : [partitionBy];\n const ob = orderBy === undefined ? [] : Array.isArray(orderBy) ? orderBy : [orderBy];\n return new WindowSpecification(pb, ob);\n }\n\n rank(opts: {\n method?: 'min' | 'dense' | 'first';\n pct?: boolean;\n partitionBy?: ColumnWithJoin | ColumnWithJoin[];\n orderBy?: SortOperation | SortOperation[];\n } = {}): WindowFunctionOperation {\n const { method = 'min', pct = false, partitionBy, orderBy } = opts;\n let func: WindowFunction;\n let name: string;\n if (pct) {\n if (method === 'max' as string) { func = WindowFunction.CUME_DIST; name = 'Cume Dist'; }\n else { func = WindowFunction.PERCENT_RANK; name = 'Percent Rank'; }\n } else if (method === 'first') { func = WindowFunction.ROW_NUMBER; name = 'Row Number'; }\n else if (method === 'dense') { func = WindowFunction.DENSE_RANK; name = 'Dense Rank'; }\n else { func = WindowFunction.RANK; name = 'Rank'; }\n return new WindowFunctionOperation(null, func, name, undefined, [], this._windowSpec(partitionBy, orderBy));\n }\n\n qcut(buckets: number, opts: {\n partitionBy?: ColumnWithJoin | ColumnWithJoin[];\n orderBy?: SortOperation | SortOperation[];\n } = {}): WindowFunctionOperation {\n return new WindowFunctionOperation(null, WindowFunction.NTILE, 'Quantile', buckets, [],\n this._windowSpec(opts.partitionBy, opts.orderBy));\n }\n\n shift(periods = 1, opts: {\n fillValue?: string | number;\n partitionBy?: ColumnWithJoin | ColumnWithJoin[];\n orderBy?: SortOperation | SortOperation[];\n } = {}): WindowFunctionOperation {\n const extraArgs: (string | number)[] = opts.fillValue !== undefined ? [opts.fillValue] : [];\n const func = periods >= 0 ? WindowFunction.LAG : WindowFunction.LEAD;\n const label = periods >= 0 ? 'Lag' : 'Lead';\n return new WindowFunctionOperation(\n new ColumnWithJoin(this._column, this._parent),\n func,\n label + ' ' + this._displayName,\n Math.abs(periods),\n extraArgs,\n this._windowSpec(opts.partitionBy, opts.orderBy),\n );\n }\n\n first(opts: {\n partitionBy?: ColumnWithJoin | ColumnWithJoin[];\n orderBy?: SortOperation | SortOperation[];\n } = {}): WindowFunctionOperation {\n return new WindowFunctionOperation(\n new ColumnWithJoin(this._column, this._parent),\n WindowFunction.FIRST_VALUE,\n 'First ' + this._displayName,\n undefined, [],\n this._windowSpec(opts.partitionBy, opts.orderBy),\n );\n }\n\n last(opts: {\n partitionBy?: ColumnWithJoin | ColumnWithJoin[];\n orderBy?: SortOperation | SortOperation[];\n } = {}): WindowFunctionOperation {\n return new WindowFunctionOperation(\n new ColumnWithJoin(this._column, this._parent),\n WindowFunction.LAST_VALUE,\n 'Last ' + this._displayName,\n undefined, [],\n this._windowSpec(opts.partitionBy, opts.orderBy),\n );\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/datafinder/attribute.ts
21
+ var attribute_exports = {};
22
+ __export(attribute_exports, {
23
+ Attribute: () => Attribute
24
+ });
25
+ module.exports = __toCommonJS(attribute_exports);
26
+
27
+ // src/model/relational.ts
28
+ var RelationalOperationElement = class {
29
+ };
30
+ var Operation = class extends RelationalOperationElement {
31
+ andOp(other) {
32
+ return new LogicalOperation(this, "AND" /* AND */, other);
33
+ }
34
+ };
35
+ var UnaryOperation = class extends Operation {
36
+ constructor(element) {
37
+ super();
38
+ this.element = element;
39
+ }
40
+ element;
41
+ };
42
+ var BinaryOperation = class extends Operation {
43
+ constructor(left, right) {
44
+ super();
45
+ this.left = left;
46
+ this.right = right;
47
+ }
48
+ left;
49
+ right;
50
+ };
51
+ var IsNullOperation = class extends UnaryOperation {
52
+ };
53
+ var IsNotNullOperation = class extends UnaryOperation {
54
+ };
55
+ var LogicalOperation = class extends BinaryOperation {
56
+ constructor(left, operator, right) {
57
+ super(left, right);
58
+ this.operator = operator;
59
+ }
60
+ operator;
61
+ };
62
+ var WindowSpecification = class {
63
+ constructor(partitionBy = [], orderBy = []) {
64
+ this.partitionBy = partitionBy;
65
+ this.orderBy = orderBy;
66
+ }
67
+ partitionBy;
68
+ orderBy;
69
+ };
70
+ var AggregateOperation = class _AggregateOperation extends UnaryOperation {
71
+ constructor(element, operator, displayName, window) {
72
+ super(element);
73
+ this.operator = operator;
74
+ this.displayName = displayName;
75
+ this.window = window;
76
+ }
77
+ operator;
78
+ displayName;
79
+ window;
80
+ over(partitionBy, orderBy) {
81
+ return new _AggregateOperation(
82
+ this.element,
83
+ this.operator,
84
+ this.displayName,
85
+ new WindowSpecification(partitionBy ?? [], orderBy ?? [])
86
+ );
87
+ }
88
+ };
89
+ var WindowFunctionOperation = class _WindowFunctionOperation extends UnaryOperation {
90
+ constructor(element, func, displayName, secondArg, extraArgs = [], window) {
91
+ super(element);
92
+ this.func = func;
93
+ this.displayName = displayName;
94
+ this.secondArg = secondArg;
95
+ this.extraArgs = extraArgs;
96
+ this.window = window;
97
+ }
98
+ func;
99
+ displayName;
100
+ secondArg;
101
+ extraArgs;
102
+ window;
103
+ over(partitionBy, orderBy) {
104
+ return new _WindowFunctionOperation(
105
+ this.element,
106
+ this.func,
107
+ this.displayName,
108
+ this.secondArg,
109
+ [...this.extraArgs],
110
+ new WindowSpecification(partitionBy ?? [], orderBy ?? [])
111
+ );
112
+ }
113
+ };
114
+ var Column = class extends RelationalOperationElement {
115
+ constructor(name, type, owner, primaryKey = false) {
116
+ super();
117
+ this.name = name;
118
+ this.type = type;
119
+ this.owner = owner;
120
+ this.primaryKey = primaryKey;
121
+ }
122
+ name;
123
+ type;
124
+ owner;
125
+ primaryKey;
126
+ table;
127
+ };
128
+ var ColumnWithJoin = class extends RelationalOperationElement {
129
+ constructor(column, parent) {
130
+ super();
131
+ this.column = column;
132
+ this.parent = parent;
133
+ }
134
+ column;
135
+ parent;
136
+ };
137
+ var SortOperation = class {
138
+ constructor(column, direction) {
139
+ this.column = column;
140
+ this.direction = direction;
141
+ }
142
+ column;
143
+ direction;
144
+ };
145
+
146
+ // src/datafinder/attribute.ts
147
+ var Attribute = class {
148
+ _displayName;
149
+ _column;
150
+ _owner;
151
+ _parent;
152
+ constructor(displayName, columnName, columnDbType, owner, parent) {
153
+ this._displayName = displayName;
154
+ this._column = new Column(columnName, columnDbType, owner);
155
+ this._owner = owner;
156
+ this._parent = parent;
157
+ }
158
+ column() {
159
+ return this._column;
160
+ }
161
+ owner() {
162
+ return this._owner;
163
+ }
164
+ parent() {
165
+ return this._parent;
166
+ }
167
+ displayName() {
168
+ return this._displayName;
169
+ }
170
+ cwj() {
171
+ return new ColumnWithJoin(this._column, this._parent);
172
+ }
173
+ count() {
174
+ return new AggregateOperation(
175
+ new ColumnWithJoin(this._column, this._parent),
176
+ "COUNT" /* COUNT */,
177
+ this._displayName + " Count"
178
+ );
179
+ }
180
+ ascending() {
181
+ return new SortOperation(new ColumnWithJoin(this._column, this._parent), "ASC" /* ASC */);
182
+ }
183
+ descending() {
184
+ return new SortOperation(new ColumnWithJoin(this._column, this._parent), "DESC" /* DESC */);
185
+ }
186
+ isNull() {
187
+ return new IsNullOperation(new ColumnWithJoin(this._column, this._parent));
188
+ }
189
+ isNotNull() {
190
+ return new IsNotNullOperation(new ColumnWithJoin(this._column, this._parent));
191
+ }
192
+ _windowSpec(partitionBy, orderBy) {
193
+ const pb = partitionBy === void 0 ? [] : Array.isArray(partitionBy) ? partitionBy : [partitionBy];
194
+ const ob = orderBy === void 0 ? [] : Array.isArray(orderBy) ? orderBy : [orderBy];
195
+ return new WindowSpecification(pb, ob);
196
+ }
197
+ rank(opts = {}) {
198
+ const { method = "min", pct = false, partitionBy, orderBy } = opts;
199
+ let func;
200
+ let name;
201
+ if (pct) {
202
+ if (method === "max") {
203
+ func = "CUME_DIST" /* CUME_DIST */;
204
+ name = "Cume Dist";
205
+ } else {
206
+ func = "PERCENT_RANK" /* PERCENT_RANK */;
207
+ name = "Percent Rank";
208
+ }
209
+ } else if (method === "first") {
210
+ func = "ROW_NUMBER" /* ROW_NUMBER */;
211
+ name = "Row Number";
212
+ } else if (method === "dense") {
213
+ func = "DENSE_RANK" /* DENSE_RANK */;
214
+ name = "Dense Rank";
215
+ } else {
216
+ func = "RANK" /* RANK */;
217
+ name = "Rank";
218
+ }
219
+ return new WindowFunctionOperation(null, func, name, void 0, [], this._windowSpec(partitionBy, orderBy));
220
+ }
221
+ qcut(buckets, opts = {}) {
222
+ return new WindowFunctionOperation(
223
+ null,
224
+ "NTILE" /* NTILE */,
225
+ "Quantile",
226
+ buckets,
227
+ [],
228
+ this._windowSpec(opts.partitionBy, opts.orderBy)
229
+ );
230
+ }
231
+ shift(periods = 1, opts = {}) {
232
+ const extraArgs = opts.fillValue !== void 0 ? [opts.fillValue] : [];
233
+ const func = periods >= 0 ? "LAG" /* LAG */ : "LEAD" /* LEAD */;
234
+ const label = periods >= 0 ? "Lag" : "Lead";
235
+ return new WindowFunctionOperation(
236
+ new ColumnWithJoin(this._column, this._parent),
237
+ func,
238
+ label + " " + this._displayName,
239
+ Math.abs(periods),
240
+ extraArgs,
241
+ this._windowSpec(opts.partitionBy, opts.orderBy)
242
+ );
243
+ }
244
+ first(opts = {}) {
245
+ return new WindowFunctionOperation(
246
+ new ColumnWithJoin(this._column, this._parent),
247
+ "FIRST_VALUE" /* FIRST_VALUE */,
248
+ "First " + this._displayName,
249
+ void 0,
250
+ [],
251
+ this._windowSpec(opts.partitionBy, opts.orderBy)
252
+ );
253
+ }
254
+ last(opts = {}) {
255
+ return new WindowFunctionOperation(
256
+ new ColumnWithJoin(this._column, this._parent),
257
+ "LAST_VALUE" /* LAST_VALUE */,
258
+ "Last " + this._displayName,
259
+ void 0,
260
+ [],
261
+ this._windowSpec(opts.partitionBy, opts.orderBy)
262
+ );
263
+ }
264
+ };
265
+ // Annotate the CommonJS export names for ESM import in node:
266
+ 0 && (module.exports = {
267
+ Attribute
268
+ });
269
+ //# sourceMappingURL=attribute.cjs.map