Better support for LIKE op in query minimization
This commit is contained in:
1 parent
e64001cddc
commit
bd55d6f512
1 file changed
+10
-1
@@ -362,6 +362,10 @@ class VarSynth extends BoolExprSynth {
|
|||||||
exp = exp.slice();
|
exp = exp.slice();
|
||||||
exp[0] = ">";
|
exp[0] = ">";
|
||||||
this.negate = true;
|
this.negate = true;
|
||||||
|
} else if (op === "NOT LIKE") {
|
||||||
|
exp = exp.slice();
|
||||||
|
exp[0] = "LIKE";
|
||||||
|
this.negate = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.expStr = JSON.stringify(exp);
|
this.expStr = JSON.stringify(exp);
|
||||||
@@ -809,6 +813,7 @@ function sopToExpression(
|
|||||||
if (Array.isArray(expr) && expr[0] === "NOT" && Array.isArray(expr[1])) {
|
if (Array.isArray(expr) && expr[0] === "NOT" && Array.isArray(expr[1])) {
|
||||||
const e: Expression[] = expr[1];
|
const e: Expression[] = expr[1];
|
||||||
if (e[0] === "IS NULL") expr = ["IS NOT NULL", ...e.slice(1)];
|
if (e[0] === "IS NULL") expr = ["IS NOT NULL", ...e.slice(1)];
|
||||||
|
else if (e[0] === "LIKE") expr = ["NOT LIKE", ...e.slice(1)];
|
||||||
else if (e[0] === "=") expr = ["<>", ...e.slice(1)];
|
else if (e[0] === "=") expr = ["<>", ...e.slice(1)];
|
||||||
else if (e[0] === "<>") expr = ["=", ...e.slice(1)];
|
else if (e[0] === "<>") expr = ["=", ...e.slice(1)];
|
||||||
else if (e[0] === ">") expr = ["<=", ...e.slice(1)];
|
else if (e[0] === ">") expr = ["<=", ...e.slice(1)];
|
||||||
@@ -830,7 +835,6 @@ function sopToExpression(
|
|||||||
function generateDcSetAndIsNull(
|
function generateDcSetAndIsNull(
|
||||||
variables: Map<number, Expression>
|
variables: Map<number, Expression>
|
||||||
): { dcSet: number[][]; isNull: Map<number, number> } {
|
): { dcSet: number[][]; isNull: Map<number, number> } {
|
||||||
// TODO support LIKE and NOT LIKE operators
|
|
||||||
const relations: Map<
|
const relations: Map<
|
||||||
string,
|
string,
|
||||||
{ op: string; rhs: boolean | number | string; var: number }[]
|
{ op: string; rhs: boolean | number | string; var: number }[]
|
||||||
@@ -843,6 +847,11 @@ function generateDcSetAndIsNull(
|
|||||||
let r = relations.get(lhs);
|
let r = relations.get(lhs);
|
||||||
if (!r) relations.set(lhs, (r = []));
|
if (!r) relations.set(lhs, (r = []));
|
||||||
r.push({ op: op, rhs: e[2], var: n });
|
r.push({ op: op, rhs: e[2], var: n });
|
||||||
|
} else if (op === "LIKE" && !Array.isArray(e[2]) && !Array.isArray(e[3])) {
|
||||||
|
const lhs = JSON.stringify(e[1]);
|
||||||
|
let r = relations.get(lhs);
|
||||||
|
if (!r) relations.set(lhs, (r = []));
|
||||||
|
r.push({ op: "", rhs: null, var: n });
|
||||||
} else {
|
} else {
|
||||||
const lhs = JSON.stringify(e);
|
const lhs = JSON.stringify(e);
|
||||||
let r = relations.get(lhs);
|
let r = relations.get(lhs);
|
||||||
|
|||||||
Reference in new issue
Block a user