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.

28 lines
883 B
JavaScript

"use strict";
const splitFilter = require("split-filter");
const operations = require("../operations");
const NoChange = require("./util/no-change");
// FIXME: Have some sort of internally-cacheable way to find nodes of a certain type? So that different optimizer visitors don't need to filter the list of clauses over and over again...
module.exports = {
name: "collapse-where",
category: [ "normalization" ],
visitors: {
select: ({ collection, clauses }) => {
let [ whereClauses, otherClauses ] = splitFilter(clauses, (clause) => clause.type === "where");
if (whereClauses.length > 1) {
let whereExpressions = whereClauses.map((clause) => clause.expression);
let newWhere = operations.where(operations.allOf(whereExpressions));
return operations.select(collection, [ newWhere ].concat(otherClauses));
} else {
return NoChange;
}
}
}
};