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.
raqb/src/optimizers/values-to-conditions.js

48 lines
1.3 KiB
JavaScript

"use strict";
const matchValue = require("match-value");
const operations = require("../operations");
const internalOperations = require("../internal-operations");
const NoChange = require("./util/no-change");
const typeOf = require("../type-of");
let valueListTypes = new Set([ "anyOfValues", "allOfValues" ]);
module.exports = {
name: "values-to-conditions",
category: [ "normalization" ],
visitors: {
condition: (rootNode) => {
let isListType = valueListTypes.has(typeOf(rootNode.expression));
let listContainsArray = isListType && Array.isArray(rootNode.expression.items); // FIXME: Make this `unpackable` metadata on the AST node?
if (!isListType || !listContainsArray) {
return NoChange;
} else {
function convertListNode(node) {
let listOperation = matchValue.literal(typeOf(node), {
anyOfValues: operations.anyOf,
allOfValues: operations.allOf,
});
let conditions = node.items.map((item) => {
if (valueListTypes.has(typeOf(item))) {
return convertListNode(item);
} else {
return internalOperations._condition({
type: rootNode.conditionType,
expression: item
});
}
});
return listOperation(conditions);
}
return convertListNode(rootNode.expression);
}
}
}
};