blob: f2d12713c9f6479fc2125cf2fb28aa55892815bb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.internal.processors.query.h2.sql;
import org.h2.util.StatementBuilder;
import org.h2.util.StringUtils;
/**
* Operation type.
*/
public enum GridSqlOperationType {
// from org.h2.expression.Operation
/** */
CONCAT(2, new BiExpressionSqlGenerator("||")),
/** */
PLUS(2, new BiExpressionSqlGenerator("+")),
/** */
MINUS(2, new BiExpressionSqlGenerator("-")),
/** */
MULTIPLY(2, new BiExpressionSqlGenerator("*")),
/** */
DIVIDE(2, new BiExpressionSqlGenerator("/")),
/** */
MODULUS(2, new BiExpressionSqlGenerator("%")),
/** */
NEGATE(1, new PrefixSqlGenerator("-", true)),
// from org.h2.expression.Comparison
/** */
EQUAL(2, new BiExpressionSqlGenerator("=")),
/** */
EQUAL_NULL_SAFE(2, new BiExpressionSqlGenerator("IS")),
/** */
BIGGER_EQUAL(2, new BiExpressionSqlGenerator(">=")),
/** */
BIGGER(2, new BiExpressionSqlGenerator(">")),
/** */
SMALLER_EQUAL(2, new BiExpressionSqlGenerator("<=")),
/** */
SMALLER(2, new BiExpressionSqlGenerator("<")),
/** */
NOT_EQUAL(2, new BiExpressionSqlGenerator("<>")),
/** */
NOT_EQUAL_NULL_SAFE(2, new BiExpressionSqlGenerator("IS NOT")),
/** */
SPATIAL_INTERSECTS(2, new IntersectsSqlGenerator()),
/** */
IS_NULL(1, new SuffixSqlGenerator("IS NULL")),
/** */
IS_NOT_NULL(1, new SuffixSqlGenerator("IS NOT NULL")),
/** */
NOT(1, new PrefixSqlGenerator("NOT", true)),
// from org.h2.expression.ConditionAndOr
/** */
AND(2, new BiExpressionSqlGenerator("AND")),
/** */
OR(2, new BiExpressionSqlGenerator("OR")),
// from
/** */
REGEXP(2, new BiExpressionSqlGenerator("REGEXP")),
/** */
LIKE(2, new BiExpressionSqlGenerator("LIKE")),
/** */
IN(-1, new ConditionInSqlGenerator()),
/** */
EXISTS(1, new PrefixSqlGenerator("EXISTS", false));
/** */
private final SqlGenerator sqlGenerator;
/** */
private final int childrenCnt;
/**
* @param childrenCnt Children count.
* @param sqlGenerator sqlGenerator.
*/
GridSqlOperationType(int childrenCnt, SqlGenerator sqlGenerator) {
assert childrenCnt > 0 || sqlGenerator instanceof ConditionInSqlGenerator : childrenCnt;
this.childrenCnt = childrenCnt;
this.sqlGenerator = sqlGenerator;
}
/**
* @param operation Operation.
*/
public String toSql(GridSqlOperation operation) {
return sqlGenerator.getSql(operation);
}
/**
* @return Children count.
*/
public int childrenCount() {
return childrenCnt;
}
/**
*
*/
private static interface SqlGenerator {
/**
* @param operation Operation expression.
*/
public String getSql(GridSqlOperation operation);
}
/**
*
*/
private static class BiExpressionSqlGenerator implements SqlGenerator {
/** */
private final String delim;
/**
* @param delim Delimiter.
*/
private BiExpressionSqlGenerator(String delim) {
this.delim = delim;
}
/** {@inheritDoc} */
@Override public String getSql(GridSqlOperation operation) {
assert operation.operationType().childrenCnt == 2;
return '(' + operation.child(0).getSQL() + " " + delim + " " + operation.child(1).getSQL() + ')';
}
}
/**
*
*/
private static class IntersectsSqlGenerator implements SqlGenerator {
/** {@inheritDoc} */
@Override public String getSql(GridSqlOperation operation) {
assert operation.operationType().childrenCnt == 2;
return "(INTERSECTS(" + operation.child(0).getSQL() + ", " + operation.child(1).getSQL() + "))";
}
}
/**
*
*/
private static class PrefixSqlGenerator implements SqlGenerator {
/** */
private final String text;
/** */
private final boolean addSpace;
/**
* @param text Text.
* @param addSpace Add space char after the prefix.
*/
private PrefixSqlGenerator(String text, boolean addSpace) {
this.text = text;
this.addSpace = addSpace;
}
/** {@inheritDoc} */
@Override public String getSql(GridSqlOperation operation) {
assert operation.operationType().childrenCnt == 1;
StringBuilder b = new StringBuilder();
b.append('(').append(text);
if (addSpace)
b.append(' ');
b.append(operation.child(0).getSQL()).append(')');
return b.toString();
}
}
/**
*
*/
private static class SuffixSqlGenerator implements SqlGenerator {
/** */
private final String text;
/**
* @param text Text.
*/
private SuffixSqlGenerator(String text) {
this.text = text;
}
/** {@inheritDoc} */
@Override public String getSql(GridSqlOperation operation) {
assert operation.operationType().childrenCnt == 1;
return '(' + operation.child(0).getSQL() + ' ' + text + ')';
}
}
/**
*
*/
private static class ConditionInSqlGenerator implements SqlGenerator {
/** {@inheritDoc} */
@Override public String getSql(GridSqlOperation operation) {
StatementBuilder buff = new StatementBuilder("(");
buff.append(operation.child(0).getSQL()).append(" IN(");
assert operation.size() > 1;
if (operation.size() == 2) {
String child = operation.child(1).getSQL();
buff.append(' ').append(StringUtils.unEnclose(child)).append(' ');
}
else {
for (int i = 1; i < operation.size(); i++) {
buff.appendExceptFirst(", ");
buff.append(operation.child(i).getSQL());
}
}
return buff.append("))").toString();
}
}
}