@directus/data-sql
Advanced tools
Comparing version 0.1.0 to 0.2.0
import { AbstractQueryNodeSortTargets, AbstractQuery } from '@directus/data'; | ||
interface SqlStatementSelectPrimitive { | ||
interface SqlStatementColumn { | ||
type: 'primitive'; | ||
table: string; | ||
column: string; | ||
} | ||
interface SqlStatementSelectColumn extends SqlStatementColumn { | ||
as?: string; | ||
@@ -17,3 +19,3 @@ } | ||
/** | ||
* This is an abstract SQL query. | ||
* This is an abstract SQL query which can be passen to all SQL drivers. | ||
* | ||
@@ -31,10 +33,12 @@ * @example | ||
interface AbstractSqlQuery { | ||
select: SqlStatementSelectPrimitive[]; | ||
select: SqlStatementSelectColumn[]; | ||
from: string; | ||
limit?: ParameterIndex; | ||
offset?: ParameterIndex; | ||
order?: AbstractSqlOrder[]; | ||
order?: AbstractSqlQueryOrderNode[]; | ||
where?: AbstractSqlQueryWhereConditionNode | AbstractSqlQueryWhereLogicalNode; | ||
intersect?: AbstractSqlQuery; | ||
parameters: (string | boolean | number)[]; | ||
} | ||
type AbstractSqlOrder = { | ||
type AbstractSqlQueryOrderNode = { | ||
orderBy: AbstractQueryNodeSortTargets; | ||
@@ -44,2 +48,22 @@ direction: 'ASC' | 'DESC'; | ||
/** | ||
* An abstract WHERE clause. | ||
*/ | ||
interface AbstractSqlQueryWhereConditionNode { | ||
type: 'condition'; | ||
target: SqlStatementColumn; | ||
operation: 'eq' | 'lt' | 'lte' | 'gt' | 'gte' | 'in' | 'contains' | 'starts_with' | 'ends_with' | 'intersects'; | ||
negate: boolean; | ||
compareTo: CompareValueNode; | ||
} | ||
interface AbstractSqlQueryWhereLogicalNode { | ||
type: 'logical'; | ||
operator: 'and' | 'or'; | ||
negate: boolean; | ||
childNodes: (AbstractSqlQueryWhereConditionNode | AbstractSqlQueryWhereLogicalNode)[]; | ||
} | ||
interface CompareValueNode { | ||
type: 'value'; | ||
parameterIndexes: number[]; | ||
} | ||
/** | ||
* An actual vendor specific SQL statement with its parameters. | ||
@@ -65,2 +89,2 @@ * @example | ||
export { AbstractSqlOrder, AbstractSqlQuery, ParameterizedSQLStatement, SqlStatementSelectPrimitive, convertAbstractQueryToAbstractSqlQuery }; | ||
export { AbstractSqlQuery, AbstractSqlQueryOrderNode, AbstractSqlQueryWhereConditionNode, AbstractSqlQueryWhereLogicalNode, CompareValueNode, ParameterizedSQLStatement, SqlStatementSelectColumn, convertAbstractQueryToAbstractSqlQuery }; |
@@ -32,2 +32,49 @@ // src/converter/convert-primitive.ts | ||
// src/converter/convert-filter.ts | ||
var convertFilter = (filter, collection, generator) => { | ||
return convertFilterWithNegate(filter, collection, generator, false); | ||
}; | ||
var convertFilterWithNegate = (filter, collection, generator, negate) => { | ||
if (filter.type === "condition") { | ||
if (filter.target.type !== "primitive") { | ||
throw new Error("Only primitives are currently supported."); | ||
} | ||
if (filter.operation === "intersects" || filter.operation === "intersects_bounding_box") { | ||
throw new Error("The intersects operators are not yet supported."); | ||
} | ||
return { | ||
where: { | ||
type: "condition", | ||
negate, | ||
operation: filter.operation, | ||
target: { | ||
column: filter.target.field, | ||
table: collection, | ||
type: "primitive" | ||
}, | ||
compareTo: { | ||
type: "value", | ||
parameterIndexes: [generator.next().value] | ||
} | ||
}, | ||
parameters: [filter.compareTo.value] | ||
}; | ||
} else if (filter.type === "negate") { | ||
return convertFilterWithNegate(filter.childNode, collection, generator, !negate); | ||
} else { | ||
const children = filter.childNodes.map( | ||
(childNode) => convertFilterWithNegate(childNode, collection, generator, false) | ||
); | ||
return { | ||
where: { | ||
type: "logical", | ||
negate, | ||
operator: filter.operator, | ||
childNodes: children.map((child) => child.where) | ||
}, | ||
parameters: children.flatMap((child) => child.parameters) | ||
}; | ||
} | ||
}; | ||
// src/converter/index.ts | ||
@@ -53,11 +100,14 @@ var convertAbstractQueryToAbstractSqlQuery = (abstractQuery) => { | ||
const idGen = parameterIndexGenerator(); | ||
if (abstractQuery.modifiers?.filter) { | ||
const convertedFilter = convertFilter(abstractQuery.modifiers.filter, abstractQuery.collection, idGen); | ||
statement.where = convertedFilter.where; | ||
statement.parameters.push(...convertedFilter.parameters); | ||
} | ||
if (abstractQuery.modifiers?.limit) { | ||
const idx = idGen.next().value; | ||
statement.limit = { parameterIndex: idx }; | ||
statement.parameters[idx] = abstractQuery.modifiers.limit.value; | ||
statement.limit = { parameterIndex: idGen.next().value }; | ||
statement.parameters.push(abstractQuery.modifiers.limit.value); | ||
} | ||
if (abstractQuery.modifiers?.offset) { | ||
const idx = idGen.next().value; | ||
statement.offset = { parameterIndex: idx }; | ||
statement.parameters[idx] = abstractQuery.modifiers.offset.value; | ||
statement.offset = { parameterIndex: idGen.next().value }; | ||
statement.parameters.push(abstractQuery.modifiers.offset.value); | ||
} | ||
@@ -64,0 +114,0 @@ if (abstractQuery.modifiers?.sort) { |
{ | ||
"name": "@directus/data-sql", | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"type": "module", | ||
@@ -29,3 +29,3 @@ "sideEffects": false, | ||
"vitest": "0.31.1", | ||
"@directus/data": "0.1.0", | ||
"@directus/data": "0.2.0", | ||
"@directus/random": "0.2.1", | ||
@@ -32,0 +32,0 @@ "@directus/tsconfig": "0.0.7", |
12468
198