UNPKG

fiql-query-builder

Version:

This module provides the utility to generate valid FIQL query strings by using a JSON objects or the custom classes provided.

100 lines (91 loc) 3.64 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.convertFromJson = exports.convertFromNode = undefined; var _tree = require('./tree'); var _constants = require('./constants'); var _exception = require('./exception'); /** * Recursively traverse tree to build query parameter * @param {FiqlNode} node The root node */ var convertFromNode = exports.convertFromNode = function convertFromNode(node) { // If the node is a boolean or operator, traverse if (node instanceof _tree.OpNode || node instanceof _tree.ExpNode || node instanceof _tree.GroupNode) { return convertFromNode(node.build()); } // We've hit the leaf return node; }; /** * Recursively trave JSON object and convert to FiqlNode * @param {Object} json JSON representation of FIQL query */ var convertToNode = function convertToNode(json) { /** * Produce FiqlNode based on key of JSON object * @param {String} k The key of the JSON object * @param {Object} v The value of the JSON object */ var handleKey = function handleKey(k, v) { switch (k.toLocaleLowerCase()) { case _constants.keyConstants.GROUP: return new _tree.GroupNode(convertToNode(v)); case _constants.keyConstants.AND: return new _tree.AndNode(convertToNode(v)); case _constants.keyConstants.OR: return new _tree.OrNode(convertToNode(v)); case _constants.keyConstants.EQUALS: return new _tree.EqNode(convertToNode(v.selector), convertToNode(v.args)); case _constants.keyConstants.NOT_EQUALS: return new _tree.NeqNode(convertToNode(v.selector), convertToNode(v.args)); case _constants.keyConstants.LESS_THAN_OR_EQUAL: return new _tree.LeNode(convertToNode(v.selector), convertToNode(v.args)); case _constants.keyConstants.LESS_THAN: return new _tree.LtNode(convertToNode(v.selector), convertToNode(v.args)); case _constants.keyConstants.GREATER_THAN: return new _tree.GtNode(convertToNode(v.selector), convertToNode(v.args)); case _constants.keyConstants.GREATER_THAN_OR_EQUAL: return new _tree.GeNode(convertToNode(v.selector), convertToNode(v.args)); case _constants.keyConstants.IN: return new _tree.InNode(convertToNode(v.selector), convertToNode(v.args)); case _constants.keyConstants.OUT: return new _tree.NotInNode(convertToNode(v.selector), convertToNode(v.args)); case _constants.keyConstants.CUSTOM_OPERATOR: return new _tree.OpNode(convertToNode(v.selector), v.operator, convertToNode(v.args)); case _constants.keyConstants.CUSTOM_EXPRESSION: return new _tree.ExpNode(v.operator, convertToNode(v.children)); default: return v; } }; // We get an array when we traverse an expression if (Array.isArray(json)) { return json.map(function (child) { return convertToNode(child); }); } // Recursively traverse object until value hit, then // produce a leaf node if (json instanceof Object) { var children = Object.keys(json).map(function (k) { return handleKey(k, json[k]); }); if (children.length === 1) { return children[0]; } return children; } return new _tree.LeafNode(json); }; /** * Converts a JSON object to a FiqlNode then to a query string * @param {Object} json JSON Object to convert */ var convertFromJson = exports.convertFromJson = function convertFromJson(json) { if (json instanceof Object && !Array.isArray(json)) { return convertFromNode(convertToNode(json)); } throw new _exception.InvalidRootError('Root must be JSON Object.'); };