plywood
Version:
A query planner and executor
82 lines (81 loc) • 3.81 kB
JavaScript
import { __extends } from "tslib";
import { Range, Set } from '../datatypes';
import { ChainableUnaryExpression, Expression, } from './baseExpression';
import { LiteralExpression } from './literalExpression';
import { OverlapExpression } from './overlapExpression';
var InExpression = (function (_super) {
__extends(InExpression, _super);
function InExpression(parameters) {
var _this = _super.call(this, parameters, dummyObject) || this;
_this._ensureOp('in');
var operandType = _this.operand.type;
var expression = _this.expression;
if (operandType) {
if (!(operandType === 'NULL' ||
expression.type === 'NULL' ||
(!Set.isSetType(operandType) && expression.canHaveType('SET')))) {
throw new TypeError("in expression ".concat(_this, " has a bad type combination ").concat(operandType, " IN ").concat(expression.type || '*'));
}
}
else {
if (!(expression.canHaveType('NUMBER_RANGE') ||
expression.canHaveType('STRING_RANGE') ||
expression.canHaveType('TIME_RANGE') ||
expression.canHaveType('SET'))) {
throw new TypeError("in expression has invalid expression type ".concat(expression.type));
}
}
_this.type = 'BOOLEAN';
return _this;
}
InExpression.fromJS = function (parameters) {
var value = ChainableUnaryExpression.jsToValue(parameters);
if (Range.isRangeType(value.expression.type)) {
console.warn('InExpression should no longer be used for ranges use OverlapExpression instead');
value.op = 'overlap';
return new OverlapExpression(value);
}
return new InExpression(value);
};
InExpression.prototype._calcChainableUnaryHelper = function (operandValue, expressionValue) {
if (!expressionValue)
return null;
return expressionValue.contains(operandValue);
};
InExpression.prototype._getSQLChainableUnaryHelper = function (dialect, operandSQL, _expressionSQL) {
var expression = this.expression;
var expressionType = expression.type;
switch (expressionType) {
case 'STRING_RANGE':
if (expression instanceof LiteralExpression) {
var stringRange = expression.value;
return dialect.inExpression(operandSQL, dialect.escapeLiteral(stringRange.start), dialect.escapeLiteral(stringRange.end), stringRange.bounds);
}
throw new Error("can not convert action to SQL ".concat(this));
case 'SET/STRING':
if (expression instanceof LiteralExpression) {
var setOfRange = expression.value;
return ('(' +
setOfRange.elements
.map(function (element) {
return dialect.inExpression(operandSQL, dialect.escapeLiteral(element), dialect.escapeLiteral(element), '[]');
})
.join(' OR ') +
')');
}
throw new Error("can not convert action to SQL ".concat(this));
default:
throw new Error("can not convert action to SQL ".concat(this));
}
};
InExpression.prototype.specialSimplify = function () {
var _a = this, operand = _a.operand, expression = _a.expression;
if (operand.type && !Set.isSetType(operand.type))
return operand.is(expression);
return this;
};
InExpression.op = 'In';
return InExpression;
}(ChainableUnaryExpression));
export { InExpression };
Expression.register(InExpression);