/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2008.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.sail.rdbms.evaluation;
import java.util.ArrayList;
import java.util.List;
import org.openrdf.query.algebra.MathExpr;
import org.openrdf.sail.rdbms.algebra.SqlCompare;
/**
* Assemblies an SQL expression.
*
* @author James Leigh
*
*/
public class SqlExprBuilder {
protected class Mark {
int length;
int size;
Mark(int length, int size) {
this.length = length;
this.size = size;
}
}
private static final String NULL = " NULL ";
private QueryBuilderFactory factory;
private List<Object> parameters = new ArrayList<Object>();
private StringBuilder where = new StringBuilder();
public SqlExprBuilder(QueryBuilderFactory factory) {
super();
this.factory = factory;
}
public SqlBracketBuilder abs() {
where.append(" ABS");
return open();
}
public SqlExprBuilder and() {
if (!isEmpty()) {
where.append("\n AND ");
}
return this;
}
public SqlExprBuilder append(CharSequence sql) {
where.append(sql);
return this;
}
public void appendBoolean(boolean booleanValue) {
if (booleanValue) {
where.append(" 1=1 ");
} else {
where.append(" 0=1 ");
}
}
public SqlExprBuilder appendNull() {
where.append(getSqlNull());
return this;
}
public SqlExprBuilder appendNumeric(double doubleValue) {
where.append(" ? ");
parameters.add(doubleValue);
return this;
}
public void appendOperator(SqlCompare.Operator op) {
switch (op) {
case GE:
where.append(" >= ");
break;
case GT:
where.append(" > ");
break;
case LE:
where.append(" <= ");
break;
case LT:
where.append(" < ");
break;
}
}
public void as(String column) {
where.append(" AS ").append(column);
}
public SqlExprBuilder number(Number time) {
where.append(" ? ");
parameters.add(time);
return this;
}
public SqlExprBuilder bool(Boolean b) {
where.append(" ? ");
parameters.add(b);
return this;
}
public SqlCaseBuilder caseBegin() {
return new SqlCaseBuilder(this);
}
public SqlExprBuilder column(String alias, String column) {
where.append(alias).append(".").append(column);
return this;
}
public SqlExprBuilder columnEquals(String alias, String column, Number id) {
return column(alias, column).eq().number(id);
}
public SqlExprBuilder columnEquals(String alias, String column, String label) {
return column(alias, column).eq().varchar(label);
}
public SqlExprBuilder columnEquals(String alias, String column, Boolean b) {
return column(alias, column).eq().bool(b);
}
public SqlExprBuilder columnIn(String alias, String column, Number[] ids) {
if (ids.length == 1) {
return columnEquals(alias, column, ids[0]);
}
SqlBracketBuilder open = open();
for (int i = 0; i < ids.length; i++) {
if (i > 0) {
open.or();
}
open.column(alias, column);
open.eq();
open.number(ids[i]);
}
open.close();
return this;
}
public SqlExprBuilder columnsEqual(String al1, String col1, String al2,
String col2) {
return column(al1, col1).eq().column(al2, col2);
}
public void concat() {
append(" || ");
}
public SqlExprBuilder eq() {
where.append(" = ");
return this;
}
public List<Object> getParameters() {
return parameters;
}
public boolean isEmpty() {
return where.length() == 0;
}
public SqlExprBuilder isNotNull() {
where.append(" IS NOT NULL ");
return this;
}
public SqlExprBuilder isNull() {
where.append(" IS NULL ");
return this;
}
public void like() {
where.append(" LIKE ");
}
public SqlBracketBuilder lowerCase() {
where.append(" lower");
return open();
}
public void math(MathExpr.MathOp op) {
append(" ").append(op.getSymbol()).append(" ");
}
public SqlBracketBuilder mod(int value) {
where.append(" MOD");
SqlBracketBuilder open = open();
open.setClosing("," + value + open.getClosing());
return open;
}
public SqlBracketBuilder not() {
where.append(" NOT");
return open();
}
public SqlExprBuilder notEqual() {
where.append(" != ");
return this;
}
public SqlBracketBuilder open(String open) {
return factory.createSqlBracketBuilder(this, open);
}
public SqlBracketBuilder open() {
return factory.createSqlBracketBuilder(this);
}
public SqlExprBuilder or() {
append(" OR ");
return this;
}
public void plus(int range) {
where.append(" + " + range);
}
public SqlRegexBuilder regex() {
return factory.createSqlRegexBuilder(this);
}
public void rightShift(int rightShift) {
where.append(" >> " + rightShift);
}
public CharSequence toSql() {
return where;
}
@Override
public String toString() {
return where.toString();
}
public SqlExprBuilder varchar(String stringValue) {
if (stringValue == null) {
appendNull();
} else {
where.append(" ? ");
parameters.add(stringValue);
}
return this;
}
protected void addParameters(List<Object> params) {
parameters.addAll(params);
}
protected String getSqlNull() {
return NULL;
}
protected Mark mark() {
return new Mark(where.length(), parameters.size());
}
protected void reset(Mark mark) {
where.delete(mark.length, where.length());
for (int i = parameters.size() - 1; i >= mark.size; i--) {
parameters.remove(i);
}
}
public SqlBracketBuilder MbrContains() {
where.append("MBRContains");
return open();
}
public SqlBracketBuilder PolyFromText() {
where.append("PolyFromText");
// SqlBracketBuilder open = open("(CONCAT(\"'\",");
// open.setClosing(",\"'\"))");
// return open;
return open();
}
public SqlBracketBuilder Polygon() {
where.append("POLYGON");
SqlBracketBuilder open = open("((");
open.setClosing("))");
return open;
}
public void comma() {
where.append(", ");
}
}