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.

149 lines
3.9 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 util = require('util');
const utils = require('../utils');
const types = require('../types');
/** @private */
const kind = {
custom: 0,
keys: 1,
composites: 2
};
/**
* Creates a new Index instance.
* @classdesc Describes a CQL index.
* @param {String} name
* @param {String} target
* @param {Number|String} kind
* @param {Object} options
* @alias module:metadata~Index
* @constructor
*/
function Index(name, target, kind, options) {
/**
* Name of the index.
* @type {String}
*/
this.name = name;
/**
* Target of the index.
* @type {String}
*/
this.target = target;
/**
* A numeric value representing index kind (0: custom, 1: keys, 2: composite);
* @type {Number}
*/
this.kind = typeof kind === 'string' ? getKindByName(kind) : kind;
/**
* An associative array containing the index options
* @type {Object}
*/
this.options = options;
}
/**
* Determines if the index is of composites kind
* @returns {Boolean}
*/
Index.prototype.isCompositesKind = function () {
return this.kind === kind.composites;
};
/**
* Determines if the index is of keys kind
* @returns {Boolean}
*/
Index.prototype.isKeysKind = function () {
return this.kind === kind.keys;
};
/**
* Determines if the index is of custom kind
* @returns {Boolean}
*/
Index.prototype.isCustomKind = function () {
return this.kind === kind.custom;
};
/**
* Parses Index information from rows in the 'system_schema.indexes' table
* @deprecated It will be removed in the next major version.
* @param {Array.<Row>} indexRows
* @returns {Array.<Index>}
*/
Index.fromRows = function (indexRows) {
if (!indexRows || indexRows.length === 0) {
return utils.emptyArray;
}
return indexRows.map(function (row) {
const options = row['options'];
return new Index(row['index_name'], options['target'], getKindByName(row['kind']), options);
});
};
/**
* Parses Index information from rows in the legacy 'system.schema_columns' table.
* @deprecated It will be removed in the next major version.
* @param {Array.<Row>} columnRows
* @param {Object.<String, {name, type}>} columnsByName
* @returns {Array.<Index>}
*/
Index.fromColumnRows = function (columnRows, columnsByName) {
const result = [];
for (let i = 0; i < columnRows.length; i++) {
const row = columnRows[i];
const indexName = row['index_name'];
if (!indexName) {
continue;
}
const c = columnsByName[row['column_name']];
let target;
const options = JSON.parse(row['index_options']);
if (options !== null && options['index_keys'] !== undefined) {
target = util.format("keys(%s)", c.name);
}
else if (options !== null && options['index_keys_and_values'] !== undefined) {
target = util.format("entries(%s)", c.name);
}
else if (c.type.options.frozen && (c.type.code === types.dataTypes.map || c.type.code === types.dataTypes.list ||
c.type.code === types.dataTypes.set)) {
target = util.format("full(%s)", c.name);
}
else {
target = c.name;
}
result.push(new Index(indexName, target, getKindByName(row['index_type']), options));
}
return result;
};
/**
* Gets the number representing the kind based on the name
* @param {String} name
* @returns {Number}
* @private
*/
function getKindByName(name) {
if (!name) {
return kind.custom;
}
return kind[name.toLowerCase()];
}
module.exports = Index;