ForgeTotal.js 5
es

Total.js 5

QueryBuilder operaciones, filtros y contratos de conductor

Total.js 5 · total5@0.0.19 total5reference Ejecutada con Total.js 5

Esta página cubre el QueryBuilder nativo de total5@0.0.19 (querybuilder.js). DB() devuelve un controlador de cola. Cada operación programa una llamada al driver; añade filtros y callbacks de forma síncrona antes de que se ejecute. NEWDB(name, driver) registra una conexión. NEWDB(name) la elimina. No hay motor de base de datos ni transacción implícitos en esta cola.

Para ejecutar una operación de base de datos, implementar esa operación en el driver. Query-constructor-sqlite.

OperacionesEl driver recibe
find/all(table), read/one(table), list(table)exec, table; read establece first:true, take:1; list por defecto usa take:100, skip:0
check(table), count(table)check establece first:1, take:1; el driver define el valor del resultado
insert/ins(table, data)payload
update/modify/mod/upd(table, data, upsert)payload, upsert; un resultado cero provoca un segundo insert cuando upsert está activado
remove/rem(table), truncate/clear(table), drop(table)El exec correspondiente; las operaciones destructivas necesitan soporte del driver
scalar(table, type, key, key2)scalar:{type,key,key2}; un key omitido se convierte en *
command(table, name)command:name
query(sql, params) o query(connection, sql, params)Texto en bruto en query, valores en params, la tabla está vacía; el enlace de parámetros SQL es responsabilidad del driver
Métodos de consultaOpciones / comportamiento
where(name, [comparer], value), equal(object), id(value), userid(value)Atajo de igualdad; == se convierte en =, != en ; los ID en array usan in
in/notin(name, values, [idField]), between(name,a,b), or(fn)Filtran registros; or agrupa los registros añadidos dentro de fn(builder)
array(name,[comparer],value)Comparador por defecto &&; la interpretación corresponde al driver
month/day/year/hour/minute(name,[comparer],value)Filtros por parte de fecha; comparador por defecto =
search(name,value,[where]), contains(name), empty(name)Filtran registros; la semántica de coincidencia corresponde al driver
query(fragment), join(name,table,type,a,b), permit(name,type,values,userid,required)Filtros específicos del driver; los fragmentos en bruto deben venir de código de aplicación de confianza
fields(csv), returning(csv)Arrays de nombres de campo recortados, no escapado SQL ni autorización
sort(name, descending), gridsort(csv,[localized])Cadenas de orden; true o desc seleccionan descendente
take/limit(n), skip(n), page(page,limit), paginate(page,limit,max)Desplazamientos/límites; paginate limita el tope, page no
first(), primarykey(name), schema(name), language(value,prefix,skip), debug()Metadatos para el driver; first también desenvuelve un resultado en array
gridfilter(name,query,type,[key]), autoquery(query,schema,sort,max)Convierten parámetros de consulta de grid en opciones. autoquery restringe los campos solicitados y las claves de orden a su esquema declarado
gridfields(fields,allowed)Use fields() con su propia lista de permiso: es la forma probada de elegir las columnas
callback/pipe(fn), promise(), done($,fn,param)Finalización; las promesas se rechazan ante un error del driver
data(fn), fail(fn), error/err(message,reverse)Hooks de éxito/fallo; error() rechaza resultados vacíos, reverse:true rechaza resultados verdaderos (incluido un array vacío)
set(name), nobind()Nombran el resultado en cola, o no reemplazan la salida de la cola
insert(fn,param) en un builder de updateModifica el payload antes del insert de respaldo de un upsert
audit($,message,type)Llama a variables() y audit() del contexto proporcionado tras una respuesta correcta del driver

Métodos del controlador: callback/pipe, promise, done, debug, language, load(connection, options) y exec(options, callback). load copia un subconjunto definido de opciones serializadas; exec despacha los nombres de operación admitidos. next/free son detalles internos del ciclo de vida. Una cola se detiene tras un error del driver; no deshace escrituras anteriores.

definitions/contract.js
NEWDB('contract', function(options, callback) {
	if (options.table === 'failure')
		return callback(new Error('driver failed'));
	if (options.table === 'empty')
		return callback(null, []);
	if (options.table === 'upsert') {
		MAIN.upsert.push(JSON.parse(JSON.stringify(options)));
		return callback(null, options.exec === 'update' ? 0 : options.payload);
	}
	if (options.exec === 'list')
		return callback(null, { items: [], count: 12 });
	callback(null, options.first ? [options] : options);
});
MAIN.upsert = [];
controllers/contract.js
exports.install = function() {
	ROUTE('GET /contract/', contract);
};

async function contract($) {
	try {
		var out = {};
		var methods = ['find', 'all', 'read', 'one', 'list', 'check', 'count', 'insert', 'ins', 'update', 'modify', 'mod', 'upd', 'remove', 'rem', 'truncate', 'clear', 'drop'];
		out.operations = {};
		for (var method of methods)
			out.operations[method] = await DB()[method]('contract/items', { name: 'Ann' }).promise();
		out.scalar = await DB().scalar('contract/items', 'sum', 'amount', 'group').promise();
		out.command = await DB().command('contract/items', 'vacuum').promise();
		out.raw = await DB().query('contract', 'SELECT ?', [7]).promise();
		out.filters = await DB().find('contract/items').id([1, 2]).userid({ id: 'u1' }).equal({ active: true }).where('age', '!=', 0).in('team', [{ id: 'a' }], 'id').notin('team', 'b').between('age', 18, 65).or(function(q) { q.where('role', 'a').where('role', 'b'); }).array('tags', ['x']).month('created', 1).day('created', 2).year('created', '>=', 2020).hour('created', 3).minute('created', 4).search('name', 'ann', 'beg').contains('email').empty('deleted').query('trusted_fragment').join('team', 'teams', 'left', 'a.id', 'b.id').permit('permissions', 'RW', ['team'], 'u1', false).promise();
		out.options = await DB().find('contract/items').fields('id, name').returning('id, name').sort('name', true).gridsort('id_asc').limit(5).skip(2).primarykey('uid').schema('public').language({ language: 'es' }, '_').debug().promise();
		out.page = await DB().list('contract/items').paginate('2', '500', 10).promise();
		out.grid = await DB().find('contract/items').autoquery({ fields: 'id,password', sort: 'password_desc,name_desc', page: '2', limit: '500', age: '>18' }, 'id:String,name:String,age:Number', 'id_asc', 10).promise();
		out.gridfields = await DB().find('contract/items').gridfields('id', 'id,name').promise();
		var queue = DB();
		queue.read('contract/items').set('one');
		queue.count('contract/items').set('count');
		queue.find('contract/items').nobind();
		out.queue = await queue.promise();
		var hooks = [];
		await DB().read('contract/empty').data(function(v) { hooks.push(v === null ? 'null' : 'value'); }).promise();
		try { await DB().read('contract/empty').error('missing').fail(function() { hooks.push('fail'); }).promise(); } catch (e) { out.missing = String(e); }
		try { await DB().find('contract/failure').promise(); } catch (e) { out.failure = String(e); }
		out.hooks = hooks;
		out.upsert = await DB().update('contract/upsert', { name: 'new' }, true).where('id', 7).insert(function(payload, role) { payload.role = role; }, 'member').promise();
		out.upsertCalls = MAIN.upsert;
		out.load = await DB().load('contract', { table: 'items', exec: 'find', take: 2, filter: [] }).promise();
		$.json(out);
	} catch (e) { $.invalid(e); }
}