You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
5.1 KiB
JavaScript
162 lines
5.1 KiB
JavaScript
/*
|
|
* Copyright DataStax, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const errors = require('../errors');
|
|
const utils = require('../utils');
|
|
|
|
/**
|
|
* Provides utility methods to adapt and map user provided docInfo and executionOptions to a predictable object format.
|
|
* @ignore
|
|
*/
|
|
class DocInfoAdapter {
|
|
/**
|
|
* Returns an Array where each item contains the property name, the column name and the property value (to obtain
|
|
* the operator).
|
|
* When docInfo.fields is specified, it uses that array to obtain the information.
|
|
* @param {Array<String>} docKeys
|
|
* @param {null|{fields}} docInfo
|
|
* @param {Object} doc
|
|
* @param {ModelMappingInfo} mappingInfo
|
|
* @returns {Array}
|
|
*/
|
|
static getPropertiesInfo(docKeys, docInfo, doc, mappingInfo) {
|
|
let propertyKeys = docKeys;
|
|
if (docInfo && docInfo.fields && docInfo.fields.length > 0) {
|
|
propertyKeys = docInfo.fields;
|
|
}
|
|
|
|
return propertyKeys.map(propertyName => ({
|
|
propertyName,
|
|
columnName: mappingInfo.getColumnName(propertyName),
|
|
value: doc[propertyName],
|
|
fromModel: mappingInfo.getFromModelFn(propertyName)
|
|
}));
|
|
}
|
|
|
|
/**
|
|
* @param {{orderBy}} docInfo
|
|
* @param {ModelMappingInfo} mappingInfo
|
|
* @returns {Array<String>}
|
|
*/
|
|
static adaptOrderBy(docInfo, mappingInfo){
|
|
if (!docInfo || !docInfo.orderBy) {
|
|
return utils.emptyArray;
|
|
}
|
|
return Object.keys(docInfo.orderBy).map(key => {
|
|
const value = docInfo.orderBy[key];
|
|
const ordering = typeof value === 'string' ? value.toUpperCase() : value;
|
|
if (ordering !== 'ASC' && ordering !== 'DESC') {
|
|
throw new errors.ArgumentError('Order must be either "ASC" or "DESC", obtained: ' + value);
|
|
}
|
|
return [ mappingInfo.getColumnName(key), ordering ];
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Returns the QueryOptions for an INSERT/UPDATE/DELETE statement.
|
|
* @param {Object|String|undefined} executionOptions
|
|
* @param {Boolean} isIdempotent
|
|
*/
|
|
static adaptOptions(executionOptions, isIdempotent) {
|
|
const options = {
|
|
prepare: true,
|
|
executionProfile: undefined,
|
|
timestamp: undefined,
|
|
isIdempotent: isIdempotent
|
|
};
|
|
|
|
if (typeof executionOptions === 'string') {
|
|
options.executionProfile = executionOptions;
|
|
}
|
|
else if (executionOptions !== null && executionOptions !== undefined) {
|
|
options.executionProfile = executionOptions.executionProfile;
|
|
options.timestamp = executionOptions.timestamp;
|
|
|
|
if (executionOptions.isIdempotent !== undefined) {
|
|
options.isIdempotent = executionOptions.isIdempotent;
|
|
}
|
|
}
|
|
return options;
|
|
}
|
|
|
|
/**
|
|
* Returns the QueryOptions for a SELECT statement.
|
|
* @param {Object|String|undefined} executionOptions
|
|
* @param {Boolean} [overrideIdempotency]
|
|
*/
|
|
static adaptAllOptions(executionOptions, overrideIdempotency) {
|
|
const options = {
|
|
prepare: true,
|
|
executionProfile: undefined,
|
|
fetchSize: undefined,
|
|
pageState: undefined,
|
|
timestamp: undefined,
|
|
isIdempotent: undefined
|
|
};
|
|
|
|
if (typeof executionOptions === 'string') {
|
|
options.executionProfile = executionOptions;
|
|
}
|
|
else if (executionOptions !== null && executionOptions !== undefined) {
|
|
options.executionProfile = executionOptions.executionProfile;
|
|
options.fetchSize = executionOptions.fetchSize;
|
|
options.pageState = executionOptions.pageState;
|
|
options.timestamp = executionOptions.timestamp;
|
|
options.isIdempotent = executionOptions.isIdempotent;
|
|
}
|
|
|
|
if (overrideIdempotency) {
|
|
options.isIdempotent = true;
|
|
}
|
|
|
|
return options;
|
|
}
|
|
|
|
/**
|
|
* Returns the QueryOptions for a batch statement.
|
|
* @param {Object|String|undefined} executionOptions
|
|
* @param {Boolean} isIdempotent
|
|
* @param {Boolean} isCounter
|
|
*/
|
|
static adaptBatchOptions(executionOptions, isIdempotent, isCounter) {
|
|
const options = {
|
|
prepare: true,
|
|
executionProfile: undefined,
|
|
timestamp: undefined,
|
|
logged: undefined,
|
|
isIdempotent: isIdempotent,
|
|
counter: isCounter
|
|
};
|
|
|
|
if (typeof executionOptions === 'string') {
|
|
options.executionProfile = executionOptions;
|
|
}
|
|
else if (executionOptions !== null && executionOptions !== undefined) {
|
|
options.executionProfile = executionOptions.executionProfile;
|
|
options.timestamp = executionOptions.timestamp;
|
|
options.logged = executionOptions.logged !== false;
|
|
|
|
if (executionOptions.isIdempotent !== undefined) {
|
|
options.isIdempotent = executionOptions.isIdempotent;
|
|
}
|
|
}
|
|
return options;
|
|
}
|
|
}
|
|
|
|
module.exports = DocInfoAdapter; |