Source: types/results-wrapper.js

"use strict";

const _Row = require("./row");
const { convertComplexType } = require("./cql-utils");
const _Encoder = require("../encoder");

/**
 * Simple way of getting results from rust driver.
 * Call the driver O(columns * rows) times
 * @param {rust.QueryResultWrapper} result
 * @param {_Encoder} encoder
 * @returns {Array<_Row> | undefined} Returns array of rows if the result is is of the RowsResult kind, and undefined otherwise
 */
function getRowsFromResultsWrapper(result, encoder) {
    let data = result.getRows();
    if (data == null) {
        // Empty results are treated as undefined
        return undefined;
    }
    let rawPage = data[0];
    let rowLength = data[1];

    let colNames = result.getColumnsNames();
    let types = result.getColumnsTypes().map((typ) => convertComplexType(typ));

    return encoder.decodeRows(rawPage, rowLength, colNames, types);
}

/**
 *
 * @param {rust.QueryResultWrapper} result
 * @returns {Array.<{name, type}>}
 */
function getColumnsMetadata(result) {
    let res = [];
    let columnsWrapper = result.getColumnsSpecs();
    // TODO: Here, we ask for column type again, despite already requesting that info at the value deserialization
    // While this provides some overhead, this is an overhead in requesting metadata, which we do not focus on optimizing
    // (and this endpoint is lazy - meaning it's not called in the benchmarks)
    let columnsTypes = result
        .getColumnsTypes()
        .map((typ) => convertComplexType(typ));
    for (let i = 0; i < columnsWrapper.length; i++) {
        let e = columnsWrapper[i];
        res.push({
            ksname: e.ksname,
            tablename: e.tablename,
            name: e.name,
            type: columnsTypes[i],
        });
    }
    return res;
}

module.exports.getRowsFromResultsWrapper = getRowsFromResultsWrapper;
module.exports.getColumnsMetadata = getColumnsMetadata;