ts-prorm-orm 1.1.0
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.
- package/CHANGELOG.md +1111 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/dist/audit/history-query.js +180 -0
- package/dist/audit/index.js +23 -0
- package/dist/audit/logger.js +236 -0
- package/dist/cache/cache-manager.js +84 -0
- package/dist/cache/index.js +16 -0
- package/dist/cache/redis-cluster-cache.js +557 -0
- package/dist/cli.js +2200 -0
- package/dist/compliance/audit-trail.js +68 -0
- package/dist/compliance/backup-verification.js +685 -0
- package/dist/compliance/breach-detector.js +505 -0
- package/dist/compliance/consent-record.js +227 -0
- package/dist/compliance/consent-versioning.js +331 -0
- package/dist/compliance/cross-border-log.js +530 -0
- package/dist/compliance/data-classifier.js +258 -0
- package/dist/compliance/data-lineage.js +565 -0
- package/dist/compliance/data-masker.js +303 -0
- package/dist/compliance/data-portability.js +265 -0
- package/dist/compliance/data-retention.js +195 -0
- package/dist/compliance/dsar-workflow.js +342 -0
- package/dist/compliance/field-encryption.js +223 -0
- package/dist/compliance/immutable-record.js +148 -0
- package/dist/compliance/index.js +260 -0
- package/dist/compliance/privacy-impact-assessment.js +364 -0
- package/dist/compliance/pseudonymization.js +269 -0
- package/dist/compliance/query-firewall.js +1182 -0
- package/dist/compliance/rate-limiter.js +580 -0
- package/dist/compliance/right-to-erasure.js +117 -0
- package/dist/compliance/row-level-security.js +246 -0
- package/dist/compliance/security-decorator.js +574 -0
- package/dist/compliance/security-monitor.js +525 -0
- package/dist/compliance/sensitive-data-discovery.js +476 -0
- package/dist/compliance/session-isolation.js +472 -0
- package/dist/compliance/tls-enforcer.js +108 -0
- package/dist/compliance/worm-storage.js +712 -0
- package/dist/connection-manager.js +198 -0
- package/dist/connection-pool.js +519 -0
- package/dist/decorators/audit.js +136 -0
- package/dist/decorators/belongs-to-many.js +115 -0
- package/dist/decorators/belongs-to.js +115 -0
- package/dist/decorators/check.js +435 -0
- package/dist/decorators/collate.js +329 -0
- package/dist/decorators/comment.js +205 -0
- package/dist/decorators/database-settings.js +236 -0
- package/dist/decorators/default.js +244 -0
- package/dist/decorators/encryption.js +235 -0
- package/dist/decorators/engine.js +97 -0
- package/dist/decorators/fk-constraints.js +594 -0
- package/dist/decorators/foreign-table.js +136 -0
- package/dist/decorators/generated.js +274 -0
- package/dist/decorators/has-many.js +127 -0
- package/dist/decorators/has-one.js +116 -0
- package/dist/decorators/hstore.js +129 -0
- package/dist/decorators/index.js +355 -0
- package/dist/decorators/json-column.js +83 -0
- package/dist/decorators/jsonb.js +101 -0
- package/dist/decorators/orm-decorators.js +425 -0
- package/dist/decorators/permissions.js +294 -0
- package/dist/decorators/procedure.js +210 -0
- package/dist/decorators/query-options.js +556 -0
- package/dist/decorators/range.js +167 -0
- package/dist/decorators/set-column.js +83 -0
- package/dist/decorators/spatial.js +114 -0
- package/dist/decorators/storage.js +580 -0
- package/dist/decorators/timezone.js +512 -0
- package/dist/decorators/trigger.js +90 -0
- package/dist/decorators/uuid.js +135 -0
- package/dist/decorators/view.js +258 -0
- package/dist/diagrams/chen-diagram.js +354 -0
- package/dist/diagrams/class-diagram.js +384 -0
- package/dist/diagrams/dependency-diagram.js +432 -0
- package/dist/diagrams/er-diagram.js +605 -0
- package/dist/diagrams/flow-diagram.js +394 -0
- package/dist/diagrams/gantt-diagram.js +411 -0
- package/dist/diagrams/index-diagram.js +353 -0
- package/dist/diagrams/index.js +184 -0
- package/dist/diagrams/migration-diagram.js +316 -0
- package/dist/diagrams/model-diagram.js +616 -0
- package/dist/diagrams/package-diagram.js +376 -0
- package/dist/diagrams/palette.js +85 -0
- package/dist/diagrams/relational-diagram.js +455 -0
- package/dist/diagrams/schemadoc-diagram.js +309 -0
- package/dist/diagrams/sequence-diagram.js +307 -0
- package/dist/diagrams/state-diagram.js +344 -0
- package/dist/diagrams/svg-dom.js +111 -0
- package/dist/diagrams/tree-diagram.js +250 -0
- package/dist/dialects/clickhouse/index.js +1742 -0
- package/dist/dialects/cockroachdb/index.js +4677 -0
- package/dist/dialects/cratedb/index.js +441 -0
- package/dist/dialects/databricks/index.js +517 -0
- package/dist/dialects/db2/index.js +2225 -0
- package/dist/dialects/dialect.js +720 -0
- package/dist/dialects/duckdb/index.js +2014 -0
- package/dist/dialects/exasol/index.js +357 -0
- package/dist/dialects/firebird/index.js +495 -0
- package/dist/dialects/greenplum/index.js +457 -0
- package/dist/dialects/hana/index.js +1741 -0
- package/dist/dialects/mariadb/index.js +3590 -0
- package/dist/dialects/mssql/index.js +2296 -0
- package/dist/dialects/mysql/index.js +4058 -0
- package/dist/dialects/oracle/index.js +2999 -0
- package/dist/dialects/postgres/index.js +5319 -0
- package/dist/dialects/query-stream-helper.js +152 -0
- package/dist/dialects/questdb/index.js +433 -0
- package/dist/dialects/redshift/index.js +2277 -0
- package/dist/dialects/singlestore/index.js +354 -0
- package/dist/dialects/snowflake/index.js +2082 -0
- package/dist/dialects/spanner/index.js +1768 -0
- package/dist/dialects/sqlite/index.js +3382 -0
- package/dist/dialects/tidb/index.js +377 -0
- package/dist/dialects/timescaledb/index.js +164 -0
- package/dist/dialects/trino/index.js +420 -0
- package/dist/dialects/turso/index.js +227 -0
- package/dist/dialects/vertica/index.js +317 -0
- package/dist/dialects/yugabytedb/index.js +424 -0
- package/dist/errors/index.js +472 -0
- package/dist/errors/utils.js +340 -0
- package/dist/errors.js +21 -0
- package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
- package/dist/extensions/catalog/mssql-features.js +147 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
- package/dist/extensions/catalog/oracle-db2-features.js +196 -0
- package/dist/extensions/catalog/postgres-extensions.js +516 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/types.js +13 -0
- package/dist/foreign-data.js +173 -0
- package/dist/hooks/hooks-manager.js +350 -0
- package/dist/hooks/index.js +37 -0
- package/dist/index.js +463 -0
- package/dist/logging.js +335 -0
- package/dist/migrations/index.js +40 -0
- package/dist/migrations/migration.js +196 -0
- package/dist/migrations/migrator.js +411 -0
- package/dist/migrations/prormmigration.js +275 -0
- package/dist/migrations/query-interface.js +435 -0
- package/dist/migrations/seeder.js +353 -0
- package/dist/models/associations.js +852 -0
- package/dist/models/constraints.js +288 -0
- package/dist/models/data-types.js +2518 -0
- package/dist/models/decorators.js +445 -0
- package/dist/models/index.js +33 -0
- package/dist/models/indexes.js +531 -0
- package/dist/models/methods.js +382 -0
- package/dist/models/model-manager.js +103 -0
- package/dist/models/model.js +5349 -0
- package/dist/models/operators.js +67 -0
- package/dist/models/scopes.js +189 -0
- package/dist/models/typescript-types.js +26 -0
- package/dist/nosql/aerospike/index.js +205 -0
- package/dist/nosql/allegrograph/index.js +169 -0
- package/dist/nosql/arangodb/index.js +364 -0
- package/dist/nosql/azure-blob/index.js +206 -0
- package/dist/nosql/beanstalkd/index.js +231 -0
- package/dist/nosql/beequeue/index.js +210 -0
- package/dist/nosql/bigchaindb/index.js +195 -0
- package/dist/nosql/bigtable/index.js +224 -0
- package/dist/nosql/blazegraph/index.js +173 -0
- package/dist/nosql/bullmq/index.js +191 -0
- package/dist/nosql/cassandra/index.js +174 -0
- package/dist/nosql/chroma/index.js +190 -0
- package/dist/nosql/cloudflare-kv/index.js +220 -0
- package/dist/nosql/coherence/index.js +200 -0
- package/dist/nosql/cosmosdb/index.js +157 -0
- package/dist/nosql/couchbase/index.js +213 -0
- package/dist/nosql/dax/index.js +212 -0
- package/dist/nosql/deno-kv/index.js +206 -0
- package/dist/nosql/dgraph/index.js +171 -0
- package/dist/nosql/doris/index.js +169 -0
- package/dist/nosql/druid/index.js +162 -0
- package/dist/nosql/dynamodb/index.js +937 -0
- package/dist/nosql/elasticsearch/index.js +377 -0
- package/dist/nosql/etcd/index.js +502 -0
- package/dist/nosql/eventhubs/index.js +213 -0
- package/dist/nosql/eventstore/index.js +254 -0
- package/dist/nosql/faunadb/index.js +188 -0
- package/dist/nosql/firestore/index.js +177 -0
- package/dist/nosql/fluree/index.js +148 -0
- package/dist/nosql/fuseki/index.js +170 -0
- package/dist/nosql/gcs/index.js +172 -0
- package/dist/nosql/gearman/index.js +160 -0
- package/dist/nosql/geode/index.js +196 -0
- package/dist/nosql/graphdb/index.js +169 -0
- package/dist/nosql/graylog/index.js +188 -0
- package/dist/nosql/gridgain/index.js +171 -0
- package/dist/nosql/hazelcast/index.js +162 -0
- package/dist/nosql/hbase/index.js +230 -0
- package/dist/nosql/ignite/index.js +173 -0
- package/dist/nosql/immudb/index.js +184 -0
- package/dist/nosql/index.js +232 -0
- package/dist/nosql/infinispan/index.js +200 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.js +234 -0
- package/dist/nosql/keyspaces/index.js +189 -0
- package/dist/nosql/kinesis/index.js +253 -0
- package/dist/nosql/leveldb/index.js +153 -0
- package/dist/nosql/lmdb/index.js +160 -0
- package/dist/nosql/loki/index.js +201 -0
- package/dist/nosql/marklogic/index.js +204 -0
- package/dist/nosql/materialize/index.js +145 -0
- package/dist/nosql/meilisearch/index.js +154 -0
- package/dist/nosql/memcached/index.js +223 -0
- package/dist/nosql/milvus/index.js +410 -0
- package/dist/nosql/minio/index.js +265 -0
- package/dist/nosql/momento/index.js +179 -0
- package/dist/nosql/mongodb/index.js +461 -0
- package/dist/nosql/nats/index.js +247 -0
- package/dist/nosql/nedb/index.js +164 -0
- package/dist/nosql/neo4j/index.js +450 -0
- package/dist/nosql/neptune/index.js +470 -0
- package/dist/nosql/nsq/index.js +200 -0
- package/dist/nosql/opensearch/index.js +186 -0
- package/dist/nosql/orientdb/index.js +175 -0
- package/dist/nosql/papertrail/index.js +200 -0
- package/dist/nosql/pinecone/index.js +0 -0
- package/dist/nosql/pinot/index.js +133 -0
- package/dist/nosql/pouchdb/index.js +172 -0
- package/dist/nosql/prometheus/index.js +174 -0
- package/dist/nosql/provendb/index.js +147 -0
- package/dist/nosql/pubsub/index.js +187 -0
- package/dist/nosql/pulsar/index.js +232 -0
- package/dist/nosql/qdrant/index.js +295 -0
- package/dist/nosql/qldb/index.js +192 -0
- package/dist/nosql/r2/index.js +281 -0
- package/dist/nosql/rabbitmq/index.js +237 -0
- package/dist/nosql/ravendb/index.js +175 -0
- package/dist/nosql/redis/index.js +607 -0
- package/dist/nosql/redpanda/index.js +237 -0
- package/dist/nosql/resque/index.js +203 -0
- package/dist/nosql/rethinkdb/index.js +232 -0
- package/dist/nosql/rocksdb/index.js +152 -0
- package/dist/nosql/rockset/index.js +126 -0
- package/dist/nosql/s3/index.js +298 -0
- package/dist/nosql/scylladb/index.js +178 -0
- package/dist/nosql/signoz/index.js +227 -0
- package/dist/nosql/sns/index.js +201 -0
- package/dist/nosql/solr/index.js +231 -0
- package/dist/nosql/splunk/index.js +227 -0
- package/dist/nosql/sqs/index.js +246 -0
- package/dist/nosql/stardog/index.js +169 -0
- package/dist/nosql/starrocks/index.js +170 -0
- package/dist/nosql/store.js +2 -0
- package/dist/nosql/sumologic/index.js +213 -0
- package/dist/nosql/surrealdb/index.js +179 -0
- package/dist/nosql/terminusdb/index.js +151 -0
- package/dist/nosql/tigergraph/index.js +469 -0
- package/dist/nosql/typesense/index.js +148 -0
- package/dist/nosql/unqlite/index.js +157 -0
- package/dist/nosql/upstash/index.js +167 -0
- package/dist/nosql/vercel-kv/index.js +166 -0
- package/dist/nosql/victoriametrics/index.js +213 -0
- package/dist/nosql/virtuoso/index.js +169 -0
- package/dist/nosql/weaviate/index.js +276 -0
- package/dist/operators/index.js +108 -0
- package/dist/operators.js +2690 -0
- package/dist/prisma-migrate/index.js +38 -0
- package/dist/prisma-migrate/migration-generator.js +125 -0
- package/dist/prisma-migrate/model-generator.js +172 -0
- package/dist/prisma-migrate/relations.js +100 -0
- package/dist/prisma-migrate/schema-parser.js +167 -0
- package/dist/prisma-migrate/type-mapper.js +40 -0
- package/dist/prorm.js +6832 -0
- package/dist/query-builders/cte-builder.js +80 -0
- package/dist/query-builders/functions/aggregate.js +390 -0
- package/dist/query-builders/functions/conditional.js +503 -0
- package/dist/query-builders/functions/datetime.js +695 -0
- package/dist/query-builders/functions/fulltext.js +439 -0
- package/dist/query-builders/functions/index.js +93 -0
- package/dist/query-builders/functions/json.js +427 -0
- package/dist/query-builders/functions/math.js +399 -0
- package/dist/query-builders/functions/string.js +518 -0
- package/dist/query-builders/functions/window.js +328 -0
- package/dist/query-builders/include-builder.js +323 -0
- package/dist/query-builders/index-expression-builder.js +242 -0
- package/dist/query-builders/index.js +161 -0
- package/dist/query-builders/insert-builder.js +164 -0
- package/dist/query-builders/model-helpers.js +38 -0
- package/dist/query-builders/order-limit-builder.js +239 -0
- package/dist/query-builders/sql-compiler.js +2040 -0
- package/dist/query-builders/subquery-builder.js +152 -0
- package/dist/query-builders/update-builder.js +182 -0
- package/dist/query-builders/view-builder.js +218 -0
- package/dist/query-builders/where-builder.js +1532 -0
- package/dist/query-interface.js +622 -0
- package/dist/query-optimizers/batch-optimizer.js +426 -0
- package/dist/query-optimizers/explain-plans.js +415 -0
- package/dist/query-optimizers/index.js +51 -0
- package/dist/query-optimizers/prepared-statement-cache.js +423 -0
- package/dist/query-optimizers/query-hints.js +438 -0
- package/dist/query-optimizers/query-optimizer.js +278 -0
- package/dist/query-optimizers/slow-query-logger.js +271 -0
- package/dist/replica-manager.js +507 -0
- package/dist/schema/index.js +15 -0
- package/dist/schema/migration-generator.js +374 -0
- package/dist/schema/schema-differ.js +549 -0
- package/dist/schema/types.js +6 -0
- package/dist/sql-constants.js +300 -0
- package/dist/sqlite-advanced.js +1047 -0
- package/dist/streams/index.js +12 -0
- package/dist/streams/transforms.js +178 -0
- package/dist/transaction.js +456 -0
- package/dist/types/index.js +180 -0
- package/dist/user-management.js +127 -0
- package/dist/utils/date.js +300 -0
- package/dist/utils/index.js +1079 -0
- package/dist/utils/string.js +161 -0
- package/dist/validators/index.js +19 -0
- package/dist/validators/validator.js +911 -0
- package/package.json +190 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Order and Limit builder for the ORM
|
|
4
|
+
* Handles ORDER BY, LIMIT, and OFFSET clauses
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.OrderLimitBuilder = exports.LimitOffsetBuilder = exports.OrderBuilder = void 0;
|
|
8
|
+
exports.createOrderBuilder = createOrderBuilder;
|
|
9
|
+
exports.createOrderLimitBuilder = createOrderLimitBuilder;
|
|
10
|
+
exports.buildOrder = buildOrder;
|
|
11
|
+
exports.buildLimitOffset = buildLimitOffset;
|
|
12
|
+
/**
|
|
13
|
+
* OrderBuilder class for building ORDER BY clauses
|
|
14
|
+
*/
|
|
15
|
+
class OrderBuilder {
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.options = options;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build an ORDER BY clause from Order options
|
|
21
|
+
*/
|
|
22
|
+
build(order) {
|
|
23
|
+
if (!order) {
|
|
24
|
+
return { sql: '' };
|
|
25
|
+
}
|
|
26
|
+
const orderArray = Array.isArray(order) ? order : [order];
|
|
27
|
+
const orderParts = [];
|
|
28
|
+
for (const item of orderArray) {
|
|
29
|
+
const part = this.buildOrderItem(item);
|
|
30
|
+
if (part) {
|
|
31
|
+
orderParts.push(part);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (orderParts.length === 0) {
|
|
35
|
+
return { sql: '' };
|
|
36
|
+
}
|
|
37
|
+
return { sql: `ORDER BY ${orderParts.join(', ')}` };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build a single order item
|
|
41
|
+
*/
|
|
42
|
+
buildOrderItem(item) {
|
|
43
|
+
// Handle string (raw SQL or "field ASC/DESC")
|
|
44
|
+
if (typeof item === 'string') {
|
|
45
|
+
return item;
|
|
46
|
+
}
|
|
47
|
+
// Handle OrderExpression from order helper functions (asc, desc, random)
|
|
48
|
+
if (item && typeof item === 'object' && item.__type === 'order') {
|
|
49
|
+
const direction = item.direction;
|
|
50
|
+
if (direction === 'RANDOM') {
|
|
51
|
+
// RANDOM() for SQLite/PostgreSQL, RAND() for MySQL/MariaDB
|
|
52
|
+
const dialectName = this.options.dialect?.name;
|
|
53
|
+
if (dialectName === 'mysql' || dialectName === 'mariadb') {
|
|
54
|
+
return 'RAND()';
|
|
55
|
+
}
|
|
56
|
+
// Default to RANDOM() (SQLite/PostgreSQL)
|
|
57
|
+
return 'RANDOM()';
|
|
58
|
+
}
|
|
59
|
+
return `${this.escapeId(item.field)} ${direction}`;
|
|
60
|
+
}
|
|
61
|
+
// Handle array: ['field', 'ASC'] or [['field', 'ASC'], ['field2', 'DESC']]
|
|
62
|
+
if (Array.isArray(item)) {
|
|
63
|
+
// Check if it's a nested array (multiple order items)
|
|
64
|
+
if (item.length === 0) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
// If first element is an array, it's a list of order items
|
|
68
|
+
if (Array.isArray(item[0])) {
|
|
69
|
+
const parts = [];
|
|
70
|
+
for (const nestedItem of item) {
|
|
71
|
+
const nestedPart = this.buildOrderItem(nestedItem);
|
|
72
|
+
if (nestedPart) {
|
|
73
|
+
parts.push(nestedPart);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return parts.join(', ');
|
|
77
|
+
}
|
|
78
|
+
// Single order item: [field, direction] or [field]
|
|
79
|
+
const field = item[0];
|
|
80
|
+
const direction = item[1]?.toUpperCase() || 'ASC';
|
|
81
|
+
if (typeof field === 'string') {
|
|
82
|
+
return `${this.escapeId(field)} ${direction}`;
|
|
83
|
+
}
|
|
84
|
+
// Handle column reference: Op.col('column_name')
|
|
85
|
+
if (field && typeof field === 'object' && '$col' in field) {
|
|
86
|
+
const colRef = field;
|
|
87
|
+
return `${this.escapeId(colRef.$col)} ${direction}`;
|
|
88
|
+
}
|
|
89
|
+
// Handle [Model, 'field'] or [Model, ['field1', 'field2']]
|
|
90
|
+
if (field && typeof field === 'object') {
|
|
91
|
+
const model = field;
|
|
92
|
+
const modelName = model.tableName || model.name || String(model);
|
|
93
|
+
const fields = item[1];
|
|
94
|
+
if (Array.isArray(fields)) {
|
|
95
|
+
// Multiple fields from model
|
|
96
|
+
return fields
|
|
97
|
+
.map((f) => `${this.escapeId(modelName)}.${this.escapeId(f)} ${direction}`)
|
|
98
|
+
.join(', ');
|
|
99
|
+
}
|
|
100
|
+
return `${this.escapeId(modelName)}.${this.escapeId(String(fields))} ${direction}`;
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
// Handle object: { model: Model, as: 'alias', field: 'name', order: 'DESC' }
|
|
105
|
+
if (item && typeof item === 'object') {
|
|
106
|
+
const model = item.model;
|
|
107
|
+
const modelName = model?.tableName || model?.name || item.as || String(model);
|
|
108
|
+
const field = item.field || item.attribute;
|
|
109
|
+
const direction = item.order?.toUpperCase() || 'ASC';
|
|
110
|
+
if (field) {
|
|
111
|
+
return `${this.escapeId(modelName)}.${this.escapeId(String(field))} ${direction}`;
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Escape an identifier
|
|
119
|
+
*/
|
|
120
|
+
escapeId(identifier) {
|
|
121
|
+
const id = String(identifier ?? '');
|
|
122
|
+
if (this.options.dialect?.escapeId) {
|
|
123
|
+
return this.options.dialect.escapeId(id);
|
|
124
|
+
}
|
|
125
|
+
return `"${id.replace(/"/g, '""')}"`;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.OrderBuilder = OrderBuilder;
|
|
129
|
+
/**
|
|
130
|
+
* LimitBuilder class for building LIMIT and OFFSET clauses
|
|
131
|
+
*/
|
|
132
|
+
class LimitOffsetBuilder {
|
|
133
|
+
constructor(options = {}) {
|
|
134
|
+
this.options = options;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Build LIMIT and OFFSET clauses
|
|
138
|
+
* Handles SQLite which requires LIMIT when using OFFSET
|
|
139
|
+
*/
|
|
140
|
+
build(limit, offset) {
|
|
141
|
+
const parts = [];
|
|
142
|
+
// Check if we're using SQLite
|
|
143
|
+
const dialectName = this.options.dialect?.name;
|
|
144
|
+
const isSQLite = dialectName === 'sqlite';
|
|
145
|
+
if (limit !== undefined && limit !== null) {
|
|
146
|
+
const limitValue = Number(limit);
|
|
147
|
+
if (!isNaN(limitValue) && limitValue >= 0) {
|
|
148
|
+
parts.push(`LIMIT ${limitValue}`);
|
|
149
|
+
if (offset !== undefined && offset !== null) {
|
|
150
|
+
const offsetValue = Number(offset);
|
|
151
|
+
if (!isNaN(offsetValue) && offsetValue >= 0) {
|
|
152
|
+
parts.push(`OFFSET ${offsetValue}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else if (offset !== undefined && offset !== null) {
|
|
158
|
+
// If only offset is provided without limit
|
|
159
|
+
const offsetValue = Number(offset);
|
|
160
|
+
if (!isNaN(offsetValue) && offsetValue >= 0) {
|
|
161
|
+
if (isSQLite) {
|
|
162
|
+
// SQLite requires LIMIT when using OFFSET
|
|
163
|
+
// Use a very large limit to get all remaining rows
|
|
164
|
+
parts.push(`LIMIT 9223372036854775807 OFFSET ${offsetValue}`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Other databases allow OFFSET without LIMIT
|
|
168
|
+
parts.push(`OFFSET ${offsetValue}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return parts.join(' ');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.LimitOffsetBuilder = LimitOffsetBuilder;
|
|
176
|
+
/**
|
|
177
|
+
* Combined Order and Limit builder
|
|
178
|
+
*/
|
|
179
|
+
class OrderLimitBuilder {
|
|
180
|
+
constructor(options = {}) {
|
|
181
|
+
this.orderBuilder = new OrderBuilder(options);
|
|
182
|
+
this.limitOffsetBuilder = new LimitOffsetBuilder(options);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Build ORDER BY clause
|
|
186
|
+
*/
|
|
187
|
+
buildOrder(order) {
|
|
188
|
+
return this.orderBuilder.build(order);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Build LIMIT/OFFSET clause
|
|
192
|
+
*/
|
|
193
|
+
buildLimitOffset(limit, offset) {
|
|
194
|
+
return this.limitOffsetBuilder.build(limit, offset);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Build both ORDER BY and LIMIT/OFFSET
|
|
198
|
+
*/
|
|
199
|
+
build(order, limit, offset) {
|
|
200
|
+
const parts = [];
|
|
201
|
+
const orderResult = this.orderBuilder.build(order);
|
|
202
|
+
if (orderResult.sql) {
|
|
203
|
+
parts.push(orderResult.sql);
|
|
204
|
+
}
|
|
205
|
+
const limitOffset = this.limitOffsetBuilder.build(limit, offset);
|
|
206
|
+
if (limitOffset) {
|
|
207
|
+
parts.push(limitOffset);
|
|
208
|
+
}
|
|
209
|
+
return parts.join(' ');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.OrderLimitBuilder = OrderLimitBuilder;
|
|
213
|
+
/**
|
|
214
|
+
* Create an OrderBuilder instance
|
|
215
|
+
*/
|
|
216
|
+
function createOrderBuilder(options) {
|
|
217
|
+
return new OrderBuilder(options);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Create an OrderLimitBuilder instance
|
|
221
|
+
*/
|
|
222
|
+
function createOrderLimitBuilder(options) {
|
|
223
|
+
return new OrderLimitBuilder(options);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Quick helper to build ORDER BY clause
|
|
227
|
+
*/
|
|
228
|
+
function buildOrder(order, options) {
|
|
229
|
+
const builder = new OrderBuilder(options);
|
|
230
|
+
return builder.build(order);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Quick helper to build LIMIT/OFFSET clause
|
|
234
|
+
*/
|
|
235
|
+
function buildLimitOffset(limit, offset) {
|
|
236
|
+
const builder = new LimitOffsetBuilder();
|
|
237
|
+
return builder.build(limit, offset);
|
|
238
|
+
}
|
|
239
|
+
exports.default = OrderLimitBuilder;
|