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.
156 lines
4.8 KiB
JavaScript
156 lines
4.8 KiB
JavaScript
2 years ago
|
/*
|
||
|
* 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 utils = require('../../utils');
|
||
|
|
||
|
/**
|
||
|
* Creates a new instance of <code>GraphResultSet</code>.
|
||
|
* @class
|
||
|
* @classdesc
|
||
|
* Represents the result set of a [graph query execution]{@link Client#executeGraph} containing vertices, edges or
|
||
|
* scalar values depending on the query.
|
||
|
* <p>
|
||
|
* It allows iteration of the items using <code>for..of</code> statements under ES2015 and exposes
|
||
|
* <code>forEach()</code>, <code>first()</code> and <code>toArray()</code> to access the underlying items.
|
||
|
* </p>
|
||
|
* @example
|
||
|
* for (let vertex of result} { ... }
|
||
|
* @example
|
||
|
* const arr = result.toArray();
|
||
|
* @example
|
||
|
* const vertex = result.first();
|
||
|
* @param {ResultSet} result
|
||
|
* @param {Function} [rowParser]
|
||
|
* @alias module:datastax/graph~GraphResultSet
|
||
|
* @constructor
|
||
|
*/
|
||
|
function GraphResultSet(result, rowParser) {
|
||
|
/**
|
||
|
* Information on the execution of a successful query:
|
||
|
* @member {Object}
|
||
|
* @property {Number} achievedConsistency The consistency level that has been actually achieved by the query.
|
||
|
* @property {String} queriedHost The Cassandra host that coordinated this query.
|
||
|
* @property {Object} triedHosts Gets the associative array of host that were queried before getting a valid response,
|
||
|
* being the last host the one that replied correctly.
|
||
|
* @property {Uuid} traceId Identifier of the trace session.
|
||
|
* @property {Array.<string>} warnings Warning messages generated by the server when executing the query.
|
||
|
*/
|
||
|
this.info = result.info;
|
||
|
const rows = result.rows;
|
||
|
rowParser = rowParser || parsePlainJsonRow;
|
||
|
|
||
|
/**
|
||
|
* This property has been deprecated because it may return a lower value than the actual length of the results.
|
||
|
* Use <code>toArray()</code> instead.
|
||
|
* <p>Gets the length of the result.</p>
|
||
|
* @deprecated Use <code>toArray()</code> instead. This property will be removed in the following major version.
|
||
|
* @member {Number}
|
||
|
*/
|
||
|
this.length = result.rowLength;
|
||
|
|
||
|
/**
|
||
|
* A string token representing the current page state of query. It can be used in the following executions to
|
||
|
* continue paging and retrieve the remained of the result for the query.
|
||
|
* @member {String}
|
||
|
*/
|
||
|
this.pageState = result.pageState;
|
||
|
|
||
|
/**
|
||
|
* Returns the first element of the result or null if the result is empty.
|
||
|
* @returns {Object}
|
||
|
*/
|
||
|
this.first = function first() {
|
||
|
const iterator = this.values();
|
||
|
const item = iterator.next();
|
||
|
if (item.done) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
return item.value;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Executes a provided function once per result element.
|
||
|
* @param {Function} callback Function to execute for each element, taking two arguments: currentValue and index.
|
||
|
* @param {Object} [thisArg] Value to use as <code>this</code> when executing callback.
|
||
|
*/
|
||
|
this.forEach = function forEach(callback, thisArg) {
|
||
|
if (!rows.length) {
|
||
|
return;
|
||
|
}
|
||
|
const iterator = this.values();
|
||
|
let item = iterator.next();
|
||
|
let index = 0;
|
||
|
while (!item.done) {
|
||
|
callback.call(thisArg || this, item.value, index++);
|
||
|
item = iterator.next();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Results an Array of graph result elements (vertex, edge, scalar).
|
||
|
* @returns {Array}
|
||
|
*/
|
||
|
this.toArray = function toArray() {
|
||
|
if (!rows.length) {
|
||
|
return utils.emptyArray;
|
||
|
}
|
||
|
return utils.iteratorToArray(this.values());
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returns a new Iterator object that contains the values for each index in the result.
|
||
|
* @returns {Iterator}
|
||
|
*/
|
||
|
this.values = function* values() {
|
||
|
for (const traverser of this.getTraversers()) {
|
||
|
const bulk = traverser.bulk || 1;
|
||
|
|
||
|
for (let j = 0; j < bulk; j++) {
|
||
|
yield traverser.object;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Gets the traversers represented contained in the result set.
|
||
|
* @returns {Iterator}
|
||
|
*/
|
||
|
this.getTraversers = function* () {
|
||
|
for (const row of rows) {
|
||
|
yield rowParser(row);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
if (typeof Symbol !== 'undefined' && typeof Symbol.iterator === 'symbol') {
|
||
|
// Make iterable
|
||
|
GraphResultSet.prototype[Symbol.iterator] = function getIterator() {
|
||
|
return this.values();
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param {Row} row
|
||
|
* @private
|
||
|
*/
|
||
|
function parsePlainJsonRow(row) {
|
||
|
const parsed = JSON.parse(row['gremlin']);
|
||
|
return { object: parsed.result, bulk: parsed.bulk || 1 };
|
||
|
}
|
||
|
|
||
|
module.exports = GraphResultSet;
|