@linked-db/linked-ql
Advanced tools
Comparing version 0.9.0 to 0.9.1
@@ -14,3 +14,3 @@ { | ||
"icon": "https://webqit.io/icon.svg", | ||
"version": "0.9.0", | ||
"version": "0.9.1", | ||
"license": "MIT", | ||
@@ -17,0 +17,0 @@ "repository": { |
@@ -53,12 +53,12 @@ | ||
* | ||
* @param Number|Object|Function clauses | ||
* @param Number|Object|Function modifiers | ||
* | ||
* @param Array fields | ||
* @param Object|Function|Number clauses | ||
* @param Object|Function|Number modifiers | ||
*/ | ||
async count(...args) { | ||
const fields = [].concat(Array.isArray(args[0]) || typeof args[0] === 'string' ? args.shift() : '*'); | ||
const fields = [].concat(Array.isArray(args[0]) ? args.shift() : '*'); | ||
if (fields.length !== 1) throw new Error(`Count expects exactly one field.`); | ||
const result = await this.select([ q => q.fn('COUNT', fields[0]).as('c') ], ...args); | ||
return !Array.isArray(result)/*for when clauses.where is an ID*/ ? result.c : result[0].c; | ||
return !Array.isArray(result)/*for when modifiers.where is an ID*/ ? result.c : result[0].c; | ||
} | ||
@@ -71,6 +71,6 @@ | ||
* | ||
* @param Number|Object|Function clauses | ||
* @param Number|Object|Function modifiers | ||
* | ||
* @param Array fields | ||
* @param Object|Function|Number clauses | ||
* @param Object|Function|Number modifiers | ||
*/ | ||
@@ -83,7 +83,7 @@ async select(...args) { | ||
query.select(...fields); | ||
const clauses = args.shift() || {}; | ||
await this.$applyClauses(query, clauses); | ||
const modifiers = args.shift() || {}; | ||
await this.$applyModifiers(query, modifiers); | ||
// Handle | ||
const result = await this.database.client.query(query); | ||
if (['string', 'number'].includes(typeof clauses.where)) return result[0]; | ||
if (['string', 'number'].includes(typeof modifiers.where)) return result[0]; | ||
return result; | ||
@@ -96,10 +96,10 @@ } | ||
* @param Object payload | ||
* @param Object|Function clauses | ||
* @param Object|Function modifiers | ||
* | ||
* @param Array multilinePayload | ||
* @param Object|Function clauses | ||
* @param Object|Function modifiers | ||
* | ||
* @param Array columns | ||
* @param Array multilineValues | ||
* @param Object|Function clauses | ||
* @param Object|Function modifiers | ||
*/ | ||
@@ -109,14 +109,14 @@ async insert(...args) { | ||
query.into([this.database.name, this.name]); | ||
const [ columns = [], values = [], clauses ] = await this.$resolvePayload(...args); | ||
const [ columns = [], values = [], modifiers ] = await this.$resolvePayload(...args); | ||
// Payload | ||
if (columns.length) query.columns(...columns); | ||
for (const row of values) query.values(...row); | ||
if (_isObject(clauses) && clauses.returning) { | ||
query.returning(clauses.returning); | ||
} else if (_isFunction(clauses)) { | ||
clauses(query); | ||
if (_isObject(modifiers) && modifiers.returning) { | ||
query.returning(modifiers.returning); | ||
} else if (_isFunction(modifiers)) { | ||
modifiers(query); | ||
} | ||
// Handle | ||
const result = await this.database.client.query(query); | ||
if (_isObject(args[0]) && clauses?.returning) return result[0]; | ||
if (_isObject(args[0]) && modifiers?.returning) return result[0]; | ||
return result; | ||
@@ -129,10 +129,10 @@ } | ||
* @param Object payload | ||
* @param Object|Function clauses | ||
* @param Object|Function modifiers | ||
* | ||
* @param Array multilinePayload | ||
* @param Object|Function clauses | ||
* @param Object|Function modifiers | ||
* | ||
* @param Array columns | ||
* @param Array multilineValues | ||
* @param Object|Function clauses | ||
* @param Object|Function modifiers | ||
*/ | ||
@@ -142,10 +142,10 @@ async upsert(...args) { | ||
query.into([this.database.name, this.name]); | ||
const [ columns = [], values = [], clauses ] = await this.$resolvePayload(...args); | ||
const [ columns = [], values = [], modifiers ] = await this.$resolvePayload(...args); | ||
// Payload | ||
if (columns.length) query.columns(...columns); | ||
for (const row of values) query.values(...row); | ||
if (_isObject(clauses) && clauses.returning) { | ||
query.returning(clauses.returning); | ||
} else if (_isFunction(clauses)) { | ||
clauses(query); | ||
if (_isObject(modifiers) && modifiers.returning) { | ||
query.returning(modifiers.returning); | ||
} else if (_isFunction(modifiers)) { | ||
modifiers(query); | ||
} | ||
@@ -164,3 +164,3 @@ // On-conflict | ||
const result = await this.database.client.query(query); | ||
if (_isObject(args[0]) && clauses?.returning) return result[0]; | ||
if (_isObject(args[0]) && modifiers?.returning) return result[0]; | ||
return result; | ||
@@ -173,13 +173,13 @@ } | ||
* @param Object payload | ||
* @param Object|Function|Number clauses | ||
* @param Object|Function|Number modifiers | ||
*/ | ||
async update(payload, clauses) { | ||
if (!clauses) throw new Error(`The "clauses" parameter cannot be ommitted.`); | ||
async update(payload, modifiers) { | ||
if (!modifiers) throw new Error(`The "modifiers" parameter cannot be ommitted.`); | ||
const query = new UpdateStatement(this.database.client); | ||
query.table([this.database.name, this.name]); | ||
for (const [k, v] of Object.entries(payload)) query.set(k, toVal(v, this.params.autoBindings)); | ||
await this.$applyClauses(query, clauses); | ||
await this.$applyModifiers(query, modifiers); | ||
// Handle | ||
const result = await this.database.client.query(query); | ||
if (['string', 'number'].includes(typeof clauses.where) && clauses.returning) return result[0]; | ||
if (['string', 'number'].includes(typeof modifiers.where) && modifiers.returning) return result[0]; | ||
return result; | ||
@@ -191,12 +191,12 @@ } | ||
* | ||
* @param Object|Function|Number clauses | ||
* @param Object|Function|Number modifiers | ||
*/ | ||
async delete(clauses) { | ||
if (!clauses) throw new Error(`The "clauses" parameter cannot be ommitted.`); | ||
async delete(modifiers) { | ||
if (!modifiers) throw new Error(`The "modifiers" parameter cannot be ommitted.`); | ||
const query = new DeleteStatement(this.database.client); | ||
query.from([this.database.name, this.name]); | ||
await this.$applyClauses(query, clauses); | ||
await this.$applyModifiers(query, modifiers); | ||
// Handle | ||
const result = await this.database.client.query(query); | ||
if (['string', 'number'].includes(typeof clauses.where) && clauses.returning) return result[0]; | ||
if (['string', 'number'].includes(typeof modifiers.where) && modifiers.returning) return result[0]; | ||
return result; | ||
@@ -213,21 +213,21 @@ } | ||
* @param Query query | ||
* @param Object|Function|Number|Bool clauses | ||
* @param Object|Function|Number|Bool modifiers | ||
*/ | ||
async $applyClauses(query, clauses) { | ||
if (clauses === true) return; | ||
if (_isObject(clauses)) { | ||
async $applyModifiers(query, modifiers) { | ||
if (modifiers === true) return; | ||
if (_isObject(modifiers)) { | ||
const addWheres = wheres => query.where(...Object.entries(wheres).map(([k, v]) => q => q.equals(k, toVal(v, this.params.autoBindings)))); | ||
if (['string', 'number'].includes(typeof clauses.where)) { | ||
if (['string', 'number'].includes(typeof modifiers.where)) { | ||
const schema = await this.database.describeTable(this.name); | ||
const primaryKey = schema.columns?.find(col => col.primaryKey)?.name || schema.constraints?.find(cons => cons.type === 'PRIMARY_KEY')?.targetColumns[0]; | ||
if (!primaryKey) throw new Error(`Cannot resolve primary key name for implied record.`); | ||
addWheres({ [primaryKey]: clauses.where }); | ||
} else if (_isObject(clauses.where)) addWheres(clauses.where); | ||
else if (clauses.where) query.where(clauses.where); | ||
if (clauses.limit) query.limit(clauses.limit); | ||
if (clauses.returning) query.returning(clauses.returning); | ||
} else if (_isFunction(clauses)) { | ||
clauses(query); | ||
} else if (/^\d+$/.test(clauses)) { | ||
query.limit(clauses); | ||
addWheres({ [primaryKey]: modifiers.where }); | ||
} else if (_isObject(modifiers.where)) addWheres(modifiers.where); | ||
else if (modifiers.where) query.where(modifiers.where); | ||
if (modifiers.limit) query.limit(modifiers.limit); | ||
if (modifiers.returning) query.returning(modifiers.returning); | ||
} else if (_isFunction(modifiers)) { | ||
modifiers(query); | ||
} else if (/^\d+$/.test(modifiers)) { | ||
query.limit(modifiers); | ||
} | ||
@@ -240,16 +240,16 @@ } | ||
* @param Object payload | ||
* @param Object|Function clauses | ||
* @param Object|Function modifiers | ||
* | ||
* @param Array multilinePayload | ||
* @param Object|Function clauses | ||
* @param Object|Function modifiers | ||
* | ||
* @param Array columns | ||
* @param Array multilineValues | ||
* @param Object|Function clauses | ||
* @param Object|Function modifiers | ||
*/ | ||
async $resolvePayload(...args) { | ||
let columns = [], values = [], clauses; | ||
let columns = [], values = [], modifiers; | ||
if (Array.isArray(args[0]) && /*important*/args[0].every(s => typeof s === 'string') && Array.isArray(args[1])) { | ||
if (!args[1].every(s => Array.isArray(s))) throw new TypeError(`Invalid payload format.`); | ||
[ columns, values, clauses ] = args.splice(0, 3); | ||
[ columns, values, modifiers ] = args.splice(0, 3); | ||
} else { | ||
@@ -260,6 +260,6 @@ const payload = [].concat(args.shift()); | ||
values = payload.map(row => Object.values(row)); | ||
clauses = args.shift(); | ||
modifiers = args.shift(); | ||
} | ||
values = values.map(row => row.map(v => toVal(v, this.params.autoBindings))); | ||
return [columns, values, clauses]; | ||
return [columns, values, modifiers]; | ||
} | ||
@@ -266,0 +266,0 @@ } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
3713960