Source:
@@ -638,7 +638,7 @@ selectList<
Source:
@@ -680,13 +680,13 @@ selectList<
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/Queryable.html b/docs/api/Queryable.html
index 3c8e625..4216941 100644
--- a/docs/api/Queryable.html
+++ b/docs/api/Queryable.html
@@ -467,6 +467,160 @@ Returns:
+ countDoc(conditions) → {Promise}
+
+
+
+
+
+
+ Count documents matching criteria. Unlike count, this function only supports
+criteria objects.
+
+
+
+
+
+
+
+
+
+
+ Parameters:
+
+
+
+
+
+
+ Name
+
+
+ Type
+
+
+
+
+
+ Description
+
+
+
+
+
+
+
+
+ conditions
+
+
+
+
+
+Object
+
+
+
+
+
+
+
+
+
+ A criteria object.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Returns:
+
+
+
+ Number of matching documents.
+
+
+
+
+
+
+ Type
+
+
+
+Promise
+
+
+
+
+
+
+
+
+
+
+
+
+
+
find(conditionsopt , optionsopt ) → {Promise}
@@ -616,7 +770,7 @@ Parameters:
Source:
@@ -818,7 +972,7 @@ Parameters:
Source:
@@ -1014,7 +1168,7 @@ Parameters:
Source:
@@ -1264,7 +1418,7 @@ Properties
Source:
@@ -1490,7 +1644,7 @@ Properties
Source:
@@ -1646,7 +1800,7 @@ Parameters:
Source:
@@ -1710,13 +1864,13 @@ Returns:
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/SingleValueStream.html b/docs/api/SingleValueStream.html
index ff0af3f..2b1e1c0 100644
--- a/docs/api/SingleValueStream.html
+++ b/docs/api/SingleValueStream.html
@@ -197,13 +197,13 @@ Parameters:
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/Table.html b/docs/api/Table.html
index 0dff8e1..4cf550d 100644
--- a/docs/api/Table.html
+++ b/docs/api/Table.html
@@ -496,208 +496,6 @@ Parameters:
-
- findDoc(conditionsopt , optionsopt ) → {Promise}
-
-
-
-
-
-
- Find a document by searching in the body.
-
-
-
-
-
-
-
-
-
-
- Parameters:
-
-
-
-
-
-
- Name
-
-
- Type
-
-
- Attributes
-
-
-
-
- Description
-
-
-
-
-
-
-
-
- conditions
-
-
-
-
-
-Object
-|
-
-String
-
-
-
-
-
-
-
-
- <optional>
-
-
-
-
-
-
-
-
-
-
- A criteria object, prebuilt predicate,
-or raw ID value.
-
-
-
-
-
-
- options
-
-
-
-
-
-Object
-
-
-
-
-
-
-
-
- <optional>
-
-
-
-
-
-
-
-
-
-
- Query options.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Source:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Returns:
-
-
-
- Query results.
-
-
-
-
-
-
- Type
-
-
-
-Promise
-
-
-
-
-
-
-
-
-
-
-
-
-
insert(data)
@@ -1536,13 +1334,13 @@ Parameters:
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/global.html b/docs/api/global.html
index 18530bc..cc36264 100644
--- a/docs/api/global.html
+++ b/docs/api/global.html
@@ -108,13 +108,13 @@
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/index.html b/docs/api/index.html
index aa373fb..de7a0cc 100644
--- a/docs/api/index.html
+++ b/docs/api/index.html
@@ -97,7 +97,7 @@ Raw SQL Need to get weird? Massive offers a lot of features for inter
});
run
takes named parameters as well:
db.run('select * from tests where id > ${something}', {something: 1}).then(tests => {
// all tests matching the criteria
-});
Tables and Views Massive loads all views (including materialized views) and all tables having primary key constraints. Unlike object/relational mappers, Massive does not traverse relationships or build model trees. Limited support for mapping complex result objects is a potential future consideration, but if you need to correlate data from multiple tables using a view is recommended.
+});Tables and Views Massive loads all views (including materialized views), all tables having primary key constraints, and foreign tables (which cannot have primary keys). Unlike object/relational mappers, Massive does not traverse relationships or build model trees. Limited support for mapping complex result objects is a potential future consideration, but if you need to correlate data from multiple tables using a view is recommended.
Schemas Massive understands database schemas and treats any schema other than the default public
as a namespace. Objects bound to the public
schema are attached directly to the database object, while other schemas will be represented by a namespace attached to the database object, with their respective tables and views bound to the namespace.
// query a table on the public schema
db.tests.find(...).then(...);
@@ -110,6 +110,7 @@ Schemas Massive understands database schemas and treats any schema ot
'field': [1, 2, 3], // IN (x, y, z) tests
'field >': 1, // greater than
'field <=': 1, // less than or equal
+ 'field BETWEEN': [1, 100], // BETWEEN
'field LIKE': 'val%', // LIKE
'field NOT ILIKE': 'Val%', // NOT LIKE (case-insensitive)
'field ~': 'val[ue]+', // regexp match
@@ -168,7 +169,7 @@
Query Options The finder functions -- find
, findOn
});
where
allows you to write your own WHERE clause instead of using a criteria object.
db.tests.where('is_active = $1 AND version > $2', [true, 1]).then(tests => {
// all active tests with higher versions
-});
Persisting save
performs an upsert, inserting if the object has no primary key value and updating if it does.
+});Persisting save
performs an upsert, inserting if the object has no primary key value and updating if it does. save
can only be used with local tables, since foreign tables do not have primary keys to test.
db.tests.save({
version: 1,
name: 'homepage'
@@ -198,7 +199,7 @@ Query Options The finder functions -- find
, findOn
version: 1
}]).then(tests => {
// an array containing both newly-inserted tests
-});
update
has two variants. Passed an object with a value for the table's primary key field, it updates all included fields of the object based on the primary key; or, passed a criteria object and a changes map, it applies all changes to all rows matching the criteria.
+});update
has two variants. Passed an object with a value for the table's primary key field, it updates all included fields of the object based on the primary key; or, passed a criteria object and a changes map, it applies all changes to all rows matching the criteria. Only the latter variant can be used with foreign tables.
db.tests.update({
id: 1,
version: 2,
@@ -252,8 +253,14 @@ Query Options The finder functions -- find
, findOn
colors: ['gray', 'purple', 'red']
}, 'info').then(widget => {
// the product with an 'info' field containing the colors array
-});
Locate documents with findDoc
, which takes a primary key or a criteria object. Simple criteria objects (testing equality only) can leverage the GIN index on the table.
-db.reports.findDoc(1).then(report => {
+});
Much of the standard queryable API has corresponding functionality with document tables. Document query functions only use criteria objects and (in the case of findDoc
) primary key values. Simple criteria objects, testing equality only, can leverage the GIN index on the document table for improved performance.
+db.reports.countDoc({
+ 'title ilike': '%throughput%'
+}).then(count => {
+ // number of matching documents
+});
+
+db.reports.findDoc(1).then(report => {
// the report document body with the primary key included
});
@@ -261,8 +268,9 @@ Query Options The finder functions -- find
, findOn
'title ilike': '%throughput%'
}).then(reports => {
// all report documents matching the criteria
-});
searchDoc
performs a full-text search on the document body fields.
-db.reports.searchDoc({
+});
+
+db.reports.searchDoc({
fields : ["title", "description"],
term : "Kauai"
}.then(docs => {
@@ -324,13 +332,13 @@ Contributing Issues and especially pull requests are welcome! If you'
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/index.js.html b/docs/api/index.js.html
index 02f2544..d1796c1 100644
--- a/docs/api/index.js.html
+++ b/docs/api/index.js.html
@@ -89,13 +89,13 @@
Source: index.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/lib_database.js.html b/docs/api/lib_database.js.html
index 034473b..1f715f7 100644
--- a/docs/api/lib_database.js.html
+++ b/docs/api/lib_database.js.html
@@ -29,16 +29,14 @@ Source: lib/database.js
'use strict';
const _ = require('lodash');
-const co = require('co');
-const fs = require('mz/fs');
const pgp = require('pg-promise');
-const util = require('util');
const QueryStream = require('pg-query-stream');
const Query = require('./query/query');
const Executable = require('./executable');
const Queryable = require('./queryable');
const Table = require('./table');
const docify = require('./util/docify');
+const queryFile = require('./util/query-file');
/**
* A database connection.
@@ -142,17 +140,17 @@ Source: lib/database.js
*
* @function
*/
-Massive.prototype.reload = co.wrap(function* () {
+Massive.prototype.reload = function () {
if (this.tables) { this.tables.forEach(t => this.detach(t.name, 'tables')); }
if (this.views) { this.views.forEach(v => this.detach(v.name, 'views')); }
if (this.functions) { this.functions.forEach(f => this.detach(f.name, 'functions')); }
- this.tables = yield this.attach(Table, require('./loader/tables'));
- this.views = yield this.attach(Queryable, require('./loader/views'));
- this.functions = yield this.attach(Executable, require('./loader/functions'), require('./loader/scripts'));
-
- return this;
-});
+ return Promise.all([
+ this.attach(Table, require('./loader/tables')).then(tables => this.tables = tables),
+ this.attach(Queryable, require('./loader/views')).then(views => this.views = views),
+ this.attach(Executable, require('./loader/functions'), require('./loader/scripts')).then(functions => this.functions = functions)
+ ]).then(() => this);
+};
/**
* Execute a query.
@@ -221,17 +219,15 @@ Source: lib/database.js
* already exist, it will be created.
* @param {Object} doc - A JSON document.
*/
-Massive.prototype.saveDoc = co.wrap(function* (collection, doc) {
+Massive.prototype.saveDoc = function (collection, doc) {
let potentialTable = this.getObject(collection);
if (potentialTable) {
- return yield potentialTable.saveDoc(doc);
+ return potentialTable.saveDoc(doc);
} else {
- yield this.createDocumentTable(collection);
-
- return yield this.saveDoc(collection, doc);
+ return this.createDocumentTable(collection).then(() => this.saveDoc(collection, doc));
}
-});
+};
/**
* Create a new document table and attach it to the Database for usage.
@@ -241,21 +237,25 @@ Source: lib/database.js
* specified in a qualified path, 'public' is assumed.
* @return {Promise} The added table.
*/
-Massive.prototype.createDocumentTable = co.wrap(function* (path) {
- const sql = yield fs.readFile(`${__dirname}/scripts/create_document_table.sql`, "UTF-8");
- const splits = path.split(".");
+Massive.prototype.createDocumentTable = function (path) {
+ const sql = queryFile('document-table.sql');
+ const splits = path.split('.');
const tableName = splits.pop();
- const schemaName = splits.pop() || "public";
- const indexName = tableName.replace(".", "_");
-
- yield this.query(util.format(sql, path, indexName, path, indexName, path));
-
- const added = yield this.attach(Table, Promise.resolve([{schema: schemaName, pk: 'id', name: tableName}]));
-
- this.tables.push(added[0]);
-
- return added[0];
-});
+ const schemaName = splits.pop() || 'public';
+ const indexName = tableName.replace('.', '_');
+
+ return this.query(sql, {
+ schema: schemaName,
+ table: tableName,
+ index: indexName
+ }).then(() =>
+ this.attach(Table, Promise.resolve([{schema: schemaName, pk: 'id', name: tableName}]))
+ ).then(added => {
+ this.tables.push(added[0]);
+
+ return added[0];
+ });
+};
/**
* Find a database object, if attached.
@@ -347,13 +347,13 @@ Source: lib/database.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/lib_entity.js.html b/docs/api/lib_entity.js.html
index 0321585..27012c9 100644
--- a/docs/api/lib_entity.js.html
+++ b/docs/api/lib_entity.js.html
@@ -67,13 +67,13 @@ Source: lib/entity.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/lib_executable.js.html b/docs/api/lib_executable.js.html
index b2998b6..c3ef17e 100644
--- a/docs/api/lib_executable.js.html
+++ b/docs/api/lib_executable.js.html
@@ -106,13 +106,13 @@ Source: lib/executable.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/lib_query_mutators.js.html b/docs/api/lib_query_mutators.js.html
new file mode 100644
index 0000000..54f2ed9
--- /dev/null
+++ b/docs/api/lib_query_mutators.js.html
@@ -0,0 +1,133 @@
+
+
+
+
+ JSDoc: Source: lib/query/mutators.js
+
+
+
+
+
+
+
+
+
+
+
+
+
Source: lib/query/mutators.js
+
+
+
+
+
+
+
+
+ 'use strict';
+
+/** @module mutators */
+
+const _ = require('lodash');
+
+/**
+ * Build a BETWEEN (a, b) predicate.
+ */
+exports.buildBetween = condition => {
+ condition.params = condition.value;
+ condition.value = `$${condition.offset++} AND $${condition.offset++}`;
+
+ return condition;
+};
+
+/**
+ * Build an IN (x, y, z) predicate.
+ */
+exports.buildIn = condition => {
+ condition.operation.operator = condition.operation.operator === '=' ? 'IN' : 'NOT IN';
+
+ const inList = _.reduce(condition.value, (list, v) => {
+ condition.params.push(v);
+
+ return list.concat([`$${condition.offset++}`]);
+ }, []);
+
+ condition.value = `(${inList.join(',')})`;
+
+ return condition;
+};
+
+/**
+ * Interpolate values into a predicate with IS/IS NOT.
+ */
+exports.buildIs = function (condition) {
+ condition.operation.operator = condition.operation.operator === '=' ? 'IS' : 'IS NOT';
+
+ return condition;
+};
+
+/**
+ * Handle the overloads for equality tests: interpolating null and boolean
+ * values and building IN lists.
+ */
+exports.equality = function (condition) {
+ if (condition.value === null || _.isBoolean(condition.value)) { return exports.buildIs(condition); }
+ else if (_.isArray(condition.value)) { return exports.buildIn(condition); }
+ else {
+ condition.params.push(condition.value);
+
+ condition.value = `$${condition.offset}`;
+
+ return condition;
+ }
+};
+
+/**
+ * Transform an array into a safe comma-delimited string literal.
+ */
+exports.literalizeArray = condition => {
+ if (_.isArray(condition.value)) {
+ const sanitizedValues = condition.value.map(function (v) {
+ if (_.isString(v) && (v === '' || v === 'null' || v.search(/[,{}\s\\"]/) !== -1)) {
+ return `"${v.replace(/([\\"])/g, '\\$1')}"`;
+ } else if (v === null) {
+ return 'null';
+ }
+
+ return v;
+ });
+
+ condition.params.push(`{${sanitizedValues.join(',')}}` );
+ } else {
+ condition.params.push(condition.value);
+ }
+
+ condition.value = `$${condition.offset}`;
+
+ return condition;
+};
+
+
+
+
+
+
+
+
+
+
+ Modules Classes Global
+
+
+
+
+
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
+
+
+
+
+
+
diff --git a/docs/api/lib_query_operations.js.html b/docs/api/lib_query_operations.js.html
new file mode 100644
index 0000000..67bc493
--- /dev/null
+++ b/docs/api/lib_query_operations.js.html
@@ -0,0 +1,130 @@
+
+
+
+
+ JSDoc: Source: lib/query/operations.js
+
+
+
+
+
+
+
+
+
+
+
+
+
Source: lib/query/operations.js
+
+
+
+
+
+
+
+
+ 'use strict';
+
+/** @module operations */
+
+const _ = require('lodash');
+const mutators = require('./mutators');
+
+/**
+ * Operation definitions for parsing criteria objects.
+ *
+ * Keys are search strings in criteria keys. Values define an output SQL
+ * operator and an optional mutator which will be applied to the appropriate
+ * parameter value for the prepared statement.
+ *
+ * @enum
+ * @readonly
+ */
+const map = {
+ // basic comparison
+ '=': {operator: '=', mutator: mutators.equality},
+ '!': {operator: '<>', mutator: mutators.equality},
+ '>': {operator: '>'},
+ '<': {operator: '<'},
+ '>=': {operator: '>='},
+ '<=': {operator: '<='},
+ '!=': {operator: '<>', mutator: mutators.equality},
+ '<>': {operator: '<>', mutator: mutators.equality},
+ 'between': {operator: 'BETWEEN', mutator: mutators.buildBetween},
+ // array
+ '@>': {operator: '@>', mutator: mutators.literalizeArray},
+ '<@': {operator: '<@', mutator: mutators.literalizeArray},
+ '&&': {operator: '&&', mutator: mutators.literalizeArray},
+ // pattern matching
+ '~~': {operator: 'LIKE'},
+ 'like': {operator: 'LIKE'},
+ '!~~': {operator: 'NOT LIKE'},
+ 'not like': {operator: 'NOT LIKE'},
+ '~~*': {operator: 'ILIKE'},
+ 'ilike': {operator: 'ILIKE'},
+ '!~~*': {operator: 'NOT ILIKE'},
+ 'not ilike': {operator: 'NOT ILIKE'},
+ // regex
+ 'similar to': {operator: 'SIMILAR TO'},
+ 'not similar to': {operator: 'NOT SIMILAR TO'},
+ '~': {operator: '~'},
+ '!~': {operator: '!~'},
+ '~*': {operator: '~*'},
+ '!~*': {operator: '!~*'},
+ // distinct
+ 'is distinct from': {operator: 'IS DISTINCT FROM'},
+ 'is not distinct from': {operator: 'IS NOT DISTINCT FROM'}
+};
+
+/**
+ * Find the operation specified in a predicate key.
+ *
+ * @param {String} str - A predicate key from a criteria object, lowercase and
+ * sans JSON traversers.
+ * @return Operation info.
+ * @default Equality
+ */
+exports = module.exports = str => {
+ let op = _.reduce(map, function (found, val, key) {
+ // if we matched something (eg '!' for 'not equal') previously and now have
+ // matched a longer operator (eg '!~~' for 'not like'), the more specific
+ // operator is the correct one.
+ if (str.indexOf(key) > -1 && val.operator.length > found.key.length) {
+ // save the operation key as originally entered for splitting -- we
+ // don't want to be looking for '<>' when the user gave us '!='.
+ return _.assign(_.clone(val), { key: key });
+ }
+
+ return found;
+ }, {key: ''});
+
+ if (op.key == '') { op = _.clone(map['=']); }
+
+ return op;
+};
+
+
+
+
+
+
+
+
+
+
+ Modules Classes Global
+
+
+
+
+
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
+
+
+
+
+
+
diff --git a/docs/api/lib_query_query.js.html b/docs/api/lib_query_query.js.html
index e69f4f9..ec83ec1 100644
--- a/docs/api/lib_query_query.js.html
+++ b/docs/api/lib_query_query.js.html
@@ -67,6 +67,7 @@ Source: lib/query/query.js
this.limit = options.limit;
this.build = options.build;
this.document = options.document;
+ this.generator = options.generator || 'generator';
this.single = options.single || false;
this.stream = options.stream;
@@ -97,12 +98,9 @@ Source: lib/query/query.js
conditions: ` WHERE ${conditions.conditions} `,
params: conditions.params
};
- } else if (this.document) {
- // document queries not deferring to table
- this.where = where(conditions, 0, '\nWHERE', 'docGenerator');
} else {
// standard case for queryables
- this.where = where(conditions);
+ this.where = where(conditions, 0, '\nWHERE ', this.generator);
}
}
};
@@ -169,13 +167,13 @@ Source: lib/query/query.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/lib_query_where.js.html b/docs/api/lib_query_where.js.html
index 51c219e..a2c2a49 100644
--- a/docs/api/lib_query_where.js.html
+++ b/docs/api/lib_query_where.js.html
@@ -31,69 +31,10 @@ Source: lib/query/where.js
/** @module where */
const _ = require('lodash');
-const traversers = new RegExp(/[-#]>>/);
+const ops = require('./operations');
const cast = new RegExp(/(::\w+)/);
const sanitizeForRegexp = new RegExp(/([^a-zA-Z0-9\s])/g);
-
-/**
- * Transform an array into a safe comma-delimited string literal.
- */
-const literalizeArray = (arr) => {
- if (!_.isArray(arr)) { return arr; }
-
- const sanitizedValues = arr.map(function (v) {
- if (v.search(/[,{}]/) !== -1) { return `"${v}"`; }
-
- return v;
- });
-
- return `{${sanitizedValues.join(',')}}`;
-};
-
-/**
- * Operation definitions for parsing criteria objects.
- *
- * Keys are search strings in criteria keys. Values define an output SQL
- * operator and an optional mutator which will be applied to the appropriate
- * parameter value for the prepared statement.
- *
- * @enum
- * @readonly
- */
-const ops = {
- // basic comparison
- '=': {operator: '='},
- '!': {operator: '<>'},
- '>': {operator: '>'},
- '<': {operator: '<'},
- '>=': {operator: '>='},
- '<=': {operator: '<='},
- '!=': {operator: '<>'},
- '<>': {operator: '<>'},
- // array
- '@>': {operator: '@>', mutator: literalizeArray},
- '<@': {operator: '<@', mutator: literalizeArray},
- '&&': {operator: '&&', mutator: literalizeArray},
- // pattern matching
- '~~': {operator: 'LIKE'},
- 'like': {operator: 'LIKE'},
- '!~~': {operator: 'NOT LIKE'},
- 'not like': {operator: 'NOT LIKE'},
- '~~*': {operator: 'ILIKE'},
- 'ilike': {operator: 'ILIKE'},
- '!~~*': {operator: 'NOT ILIKE'},
- 'not ilike': {operator: 'NOT ILIKE'},
- // regex
- 'similar to': {operator: 'SIMILAR TO'},
- 'not similar to': {operator: 'NOT SIMILAR TO'},
- '~': {operator: '~'},
- '!~': {operator: '!~'},
- '~*': {operator: '~*'},
- '!~*': {operator: '!~*'},
- // distinct
- 'is distinct from': {operator: 'IS DISTINCT FROM'},
- 'is not distinct from': {operator: 'IS NOT DISTINCT FROM'}
-};
+const traversers = new RegExp(/[-#]>>/);
/**
* Remove whitespace from an array of token strings.
@@ -120,30 +61,6 @@ Source: lib/query/where.js
return '';
};
-/**
- * Find the operation specified in a predicate key.
- *
- * @param {String} str - A predicate key from a criteria object.
- * @return Operation info.
- * @default Equality
- */
-const getOperation = (str) => {
- str = str.toLowerCase().replace(traversers, ''); // remove JSON pathing and make case consistent
-
- return _.reduce(ops, function (found, val, key) {
- // if we matched something (eg '!' for 'not equal') previously and now have
- // matched a longer operator (eg '!~~' for 'not like'), the more specific
- // operator is the correct one.
- if (str.indexOf(key) > -1 && val.operator.length > found.key.length) {
- // save the operation key as originally entered for splitting -- we
- // don't want to be looking for '<>' when the user gave us '!='.
- return _.assign(val, { key: key });
- }
-
- return found;
- }, {key: ''});
-};
-
/**
* Quote a string, if it isn't already quoted.
*/
@@ -171,7 +88,7 @@ Source: lib/query/where.js
*/
const getCondition = function (key) {
const traverser = getMatch(key, traversers, 0);
- const operation = getOperation(key);
+ const operation = ops(key.toLowerCase().replace(traversers, '')); // remove JSON pathing and make case consistent
const splitOn = ['::'];
@@ -198,49 +115,24 @@ Source: lib/query/where.js
return {
rawField: rawField,
field: `${field}${traverser}${jsonPath}${castTo}`,
- operator: operation.operator || '=',
- mutator: operation.mutator,
+ operation: operation,
isJSON: !!traverser
};
};
-/**
- * Build an IN (x, y, z) predicate.
- */
-const buildIn = function (condition) {
- condition.operator = condition.operator === '=' ? 'IN' : 'NOT IN';
-
- const inList = _.reduce(condition.value, (list, v) => {
- condition.params.push(v);
-
- return list.concat([`$${condition.offset++}`]);
- }, []);
-
- condition.value = `(${inList.join(', ')})`;
-
- return condition;
-};
-
/**
* Generate a predicate for a normal query.
*/
const generator = function (condition) {
- if (condition.value === null) {
- //interpolate nulls directly with is/is not
- condition.operator = condition.operator === '=' ? 'IS' : 'IS NOT';
- } else if (condition.mutator || !_.isArray(condition.value)) {
- //parameterize any non-array or mutatey values
- if (condition.mutator) { condition.value = condition.mutator(condition.value); }
-
+ if (condition.operation.mutator) {
+ condition = condition.operation.mutator(condition);
+ } else if (condition.value) {
condition.params.push(condition.value);
-
condition.value = `$${condition.offset}`;
- } else if (_.isArray(condition.value)) {
- condition = buildIn(condition);
}
return {
- predicate: `${condition.field} ${condition.operator} ${condition.value}`,
+ predicate: `${condition.field} ${condition.operation.operator} ${condition.value}`,
params: condition.params
};
};
@@ -253,18 +145,18 @@ Source: lib/query/where.js
//we'll need to use a contains query to be sure we flex the index
if(_.isArray(condition.value) && _.isPlainObject(condition.value[0])) {
condition.rawField = '"body"';
- condition.operator = '@>';
+ condition.operation.operator = '@>';
condition.params.push(JSON.stringify(conditions));
condition.value = `$${condition.offset}`;
}
//if we have equality here, just use a JSON contains
- else if (condition.operator === '=' && !_.isArray(condition.value)) {
+ else if (condition.operation.operator === '=' && !_.isArray(condition.value)) {
const param = {};
param[condition.rawField] = condition.value;
condition.params.push(JSON.stringify(param));
condition.rawField = '"body"';
- condition.operator = '@>';
+ condition.operation.operator = '@>';
condition.value = `$${condition.offset}`;
}
@@ -284,18 +176,18 @@ Source: lib/query/where.js
}
//anything non-array handling
- else if (!_.isArray(condition.value)) {
+ else if (condition.operation.mutator) {
+ condition = condition.operation.mutator(condition);
+ } else {
condition.params.push(condition.value);
condition.value = `$${condition.offset}`;
- } else {
- condition = buildIn(condition);
}
condition.rawField = `("body" ->> '${condition.rawField}')${cast}`;
}
return {
- predicate: `${condition.rawField} ${condition.operator} ${condition.value}`,
+ predicate: `${condition.rawField} ${condition.operation.operator} ${condition.value}`,
params: condition.params
};
};
@@ -428,13 +320,13 @@ Source: lib/query/where.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/lib_queryable.js.html b/docs/api/lib_queryable.js.html
index e86842a..375d9d3 100644
--- a/docs/api/lib_queryable.js.html
+++ b/docs/api/lib_queryable.js.html
@@ -88,6 +88,19 @@ Source: lib/queryable.js
return this.db.query(query).then(res => Promise.resolve(res.count));
};
+/**
+ * Count documents matching criteria. Unlike count, this function only supports
+ * criteria objects.
+ *
+ * @param {Object} - A criteria object.
+ * @return {Promise} Number of matching documents.
+ */
+Queryable.prototype.countDoc = function (conditions = {}) {
+ const query = new Query(conditions, {columns: "COUNT(1)", order: null, single: true, generator: 'docGenerator'}, this);
+
+ return this.db.query(query).then(res => Promise.resolve(res.count));
+};
+
/**
* Find rows matching criteria.
*
@@ -112,6 +125,7 @@ Source: lib/queryable.js
*/
Queryable.prototype.findDoc = function(conditions = {}, options = {}) {
options.document = true;
+ options.generator = 'docGenerator';
return this.find(conditions, options);
};
@@ -224,13 +238,13 @@ Source: lib/queryable.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/lib_table.js.html b/docs/api/lib_table.js.html
index 5882c97..283164e 100644
--- a/docs/api/lib_table.js.html
+++ b/docs/api/lib_table.js.html
@@ -209,7 +209,7 @@ Source: lib/table.js
sql = `insert into ${this.fullname} (body) values($1) returning *;`;
}
- return this.db.query(sql, params, {single: true, document: true});
+ return this.db.query(sql, params, {single: true, document: true, generator: 'docGenerator'});
};
/**
@@ -228,20 +228,6 @@ Source: lib/table.js
return this.db.query(sql, [JSON.stringify(changes), id], {single: true, document: field === 'body'});
};
-/**
- * Find a document by searching in the body.
- *
- * @param {Object|String} [conditions] - A criteria object, prebuilt predicate,
- * or raw ID value.
- * @param {Object} [options] - Query options.
- * @return {Promise} Query results.
- */
-Table.prototype.findDoc = function(conditions = {}, options = {}) {
- options.document = true;
-
- return this.find(conditions, options);
-};
-
module.exports = Table;
@@ -253,13 +239,13 @@ Source: lib/table.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/lib_util_single-value-stream.js.html b/docs/api/lib_util_single-value-stream.js.html
index 580e7b4..7a87fc4 100644
--- a/docs/api/lib_util_single-value-stream.js.html
+++ b/docs/api/lib_util_single-value-stream.js.html
@@ -73,13 +73,13 @@ Source: lib/util/single-value-stream.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/lib_util_single-value.js.html b/docs/api/lib_util_single-value.js.html
index f0ffb3e..5406a89 100644
--- a/docs/api/lib_util_single-value.js.html
+++ b/docs/api/lib_util_single-value.js.html
@@ -51,13 +51,13 @@ Source: lib/util/single-value.js
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/module-massive.html b/docs/api/module-massive.html
index 0d72089..4d13a2e 100644
--- a/docs/api/module-massive.html
+++ b/docs/api/module-massive.html
@@ -528,13 +528,13 @@ Returns:
- Modules Classes Global
+ Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
diff --git a/docs/api/module-mutators.html b/docs/api/module-mutators.html
new file mode 100644
index 0000000..681825f
--- /dev/null
+++ b/docs/api/module-mutators.html
@@ -0,0 +1,498 @@
+
+
+
+
+ JSDoc: Module: mutators
+
+
+
+
+
+
+
+
+
+
+
+
+
Module: mutators
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Methods
+
+
+
+
+
+
+ (static) buildBetween()
+
+
+
+
+
+
+ Build a BETWEEN (a, b) predicate.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (static) buildIn()
+
+
+
+
+
+
+ Build an IN (x, y, z) predicate.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (static) buildIs()
+
+
+
+
+
+
+ Interpolate values into a predicate with IS/IS NOT.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (static) equality()
+
+
+
+
+
+
+ Handle the overloads for equality tests: interpolating null and boolean
+values and building IN lists.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (static) literalizeArray()
+
+
+
+
+
+
+ Transform an array into a safe comma-delimited string literal.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Modules Classes Global
+
+
+
+
+
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/api/module-operations.html b/docs/api/module-operations.html
new file mode 100644
index 0000000..8237b6b
--- /dev/null
+++ b/docs/api/module-operations.html
@@ -0,0 +1,902 @@
+
+
+
+
+ JSDoc: Module: operations
+
+
+
+
+
+
+
+
+
+
+
+
+
Module: operations
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
module:operations
+
+
+
+
+
+
+ Find the operation specified in a predicate key.
+
+
+
+
+
+
+
+
+
+
+
Parameters:
+
+
+
+
+
+
+ Name
+
+
+ Type
+
+
+
+
+
+ Description
+
+
+
+
+
+
+
+
+ str
+
+
+
+
+
+String
+
+
+
+
+
+
+
+
+
+ A predicate key from a criteria object, lowercase and
+sans JSON traversers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Default Value:
+
+
+
+
+ Source:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Returns:
+
+
+
+ Operation info.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Members
+
+
+
+ module:operations
+
+
+
+
+
+ Find the operation specified in a predicate key.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Default Value:
+
+
+
+
+ Source:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(inner, constant) map
+
+
+
+
+
+ Operation definitions for parsing criteria objects.
+
+Keys are search strings in criteria keys. Values define an output SQL
+operator and an optional mutator which will be applied to the appropriate
+parameter value for the prepared statement.
+
+
+
+
+
+
+
+
+ Properties:
+
+
+
+
+
+
+
+ Name
+
+
+ Type
+
+
+
+
+
+ Description
+
+
+
+
+
+
+
+
+ "="
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "!"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ">"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "<"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ">="
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "<="
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "!="
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "<>"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ between
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "@>"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "<@"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "&&"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "~~"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ like
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "!~~"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "not like"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "~~*"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ilike
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "!~~*"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "not ilike"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "similar to"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "not similar to"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "~"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "!~"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "~*"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "!~*"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "is distinct from"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "is not distinct from"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Modules Classes Global
+
+
+
+
+
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/api/module-where.html b/docs/api/module-where.html
index 9aeaf7b..24b1a92 100644
--- a/docs/api/module-where.html
+++ b/docs/api/module-where.html
@@ -288,7 +288,7 @@ Parameters:
Source:
@@ -402,7 +402,7 @@ module:wh
Source:
@@ -419,673 +419,10 @@ module:wh
-
-(inner, constant) ops
-
-
-
-
-
- Operation definitions for parsing criteria objects.
-
-Keys are search strings in criteria keys. Values define an output SQL
-operator and an optional mutator which will be applied to the appropriate
-parameter value for the prepared statement.
-
-
-
-
-
-
-
-
- Properties:
-
-
-
-
-
-
-
- Name
-
-
- Type
-
-
-
-
-
- Description
-
-
-
-
-
-
-
-
- "="
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "!"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ">"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "<"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ">="
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "<="
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "!="
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "<>"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "@>"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "<@"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "&&"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "~~"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- like
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "!~~"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "not like"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "~~*"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ilike
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "!~~*"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "not ilike"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "similar to"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "not similar to"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "~"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "!~"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "~*"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "!~*"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "is distinct from"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- "is not distinct from"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Source:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Methods
-
-
-
-
-
-
- (inner) buildIn()
-
-
-
-
-
-
- Build an IN (x, y, z) predicate.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Source:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Methods
@@ -1143,7 +480,7 @@
-
-
-
- Name
-
-
- Type
-
-
-
-
-
- Description
-
-
-
-
-
-
-
-
- str
-
-
-
-
-
-String
-
-
-
-
-
-
-
-
-
- A predicate key from a criteria object.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Default Value:
-
-
-
-
- Source:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Returns:
-
-
-
- Operation info.
-
-
-
-
-
-
-
-
-
-
-
-
-
- (inner) literalizeArray()
-
-
-
-
-
-
- Transform an array into a safe comma-delimited string literal.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Source:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
(inner) quote()
@@ -2217,7 +1326,7 @@ (inner) quoteSource:
@@ -2348,7 +1457,7 @@ Parameters:
Source:
@@ -2452,7 +1561,7 @@ (inner) unquo
Source:
@@ -2494,13 +1603,13 @@ (inner) unquo
- Home Modules Classes Global
+ Home Modules Classes Global
- Documentation generated by JSDoc 3.4.3 on Fri May 26 2017 00:22:22 GMT-0400 (EDT)
+ Documentation generated by JSDoc 3.4.3 on Tue May 30 2017 22:31:06 GMT-0400 (EDT)