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
873 B
JavaScript
28 lines
873 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: ({ table, 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(table, [ newWhere ].concat(otherClauses));
|
|
} else {
|
|
return NoChange;
|
|
}
|
|
}
|
|
}
|
|
};
|