001: /*
002: * Copyright Aduna (http://www.aduna-software.com/) (c) 2008.
003: *
004: * Licensed under the Aduna BSD-style license.
005: */
006: package org.openrdf.sail.rdbms.algebra.factories;
007:
008: import static org.openrdf.model.vocabulary.XMLSchema.DECIMAL;
009: import static org.openrdf.model.vocabulary.XMLSchema.DOUBLE;
010: import static org.openrdf.model.vocabulary.XMLSchema.FLOAT;
011: import static org.openrdf.model.vocabulary.XMLSchema.INTEGER;
012: import static org.openrdf.sail.rdbms.algebra.base.SqlExprSupport.in;
013: import static org.openrdf.sail.rdbms.algebra.base.SqlExprSupport.sqlNull;
014: import static org.openrdf.sail.rdbms.algebra.base.SqlExprSupport.str;
015: import static org.openrdf.sail.rdbms.algebra.base.SqlExprSupport.unsupported;
016:
017: import org.openrdf.model.Literal;
018: import org.openrdf.model.URI;
019: import org.openrdf.model.Value;
020: import org.openrdf.query.algebra.Datatype;
021: import org.openrdf.query.algebra.Lang;
022: import org.openrdf.query.algebra.MathExpr;
023: import org.openrdf.query.algebra.QueryModelNode;
024: import org.openrdf.query.algebra.Str;
025: import org.openrdf.query.algebra.ValueConstant;
026: import org.openrdf.query.algebra.ValueExpr;
027: import org.openrdf.query.algebra.Var;
028: import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
029: import org.openrdf.sail.rdbms.algebra.DatatypeColumn;
030: import org.openrdf.sail.rdbms.algebra.SqlCase;
031: import org.openrdf.sail.rdbms.algebra.SqlNull;
032: import org.openrdf.sail.rdbms.algebra.TrueValue;
033: import org.openrdf.sail.rdbms.algebra.base.SqlExpr;
034: import org.openrdf.sail.rdbms.exceptions.UnsupportedRdbmsOperatorException;
035:
036: /**
037: * Creates a datatype SQL expression.
038: *
039: * @author James Leigh
040: *
041: */
042: public class DatatypeExprFactory extends
043: QueryModelVisitorBase<UnsupportedRdbmsOperatorException> {
044: protected SqlExpr result;
045:
046: public SqlExpr createDatatypeExpr(ValueExpr expr)
047: throws UnsupportedRdbmsOperatorException {
048: result = null;
049: if (expr == null)
050: return new SqlNull();
051: expr.visit(this );
052: if (result == null)
053: return new SqlNull();
054: return result;
055: }
056:
057: @Override
058: public void meet(Datatype node) {
059: result = sqlNull();
060: }
061:
062: @Override
063: public void meet(Lang node)
064: throws UnsupportedRdbmsOperatorException {
065: result = sqlNull();
066: }
067:
068: @Override
069: public void meet(MathExpr node)
070: throws UnsupportedRdbmsOperatorException {
071: boolean divide = node.getParentNode().equals(
072: MathExpr.MathOp.DIVIDE);
073: ValueExpr left = node.getLeftArg();
074: ValueExpr right = node.getRightArg();
075: SqlCase sqlCase = new SqlCase();
076: sqlCase.when(in(str(DOUBLE), type(left), type(right)),
077: str(DOUBLE));
078: sqlCase.when(in(str(FLOAT), type(left), type(right)),
079: str(FLOAT));
080: sqlCase.when(in(str(DECIMAL), type(left), type(right)),
081: str(DECIMAL));
082: sqlCase.when(new TrueValue(), divide ? str(DECIMAL)
083: : str(INTEGER));
084: result = sqlCase;
085: }
086:
087: @Override
088: public void meet(Str node) throws UnsupportedRdbmsOperatorException {
089: result = sqlNull();
090: }
091:
092: @Override
093: public void meet(ValueConstant vc) {
094: result = valueOf(vc.getValue());
095: }
096:
097: @Override
098: public void meet(Var var) {
099: if (var.getValue() == null) {
100: result = new DatatypeColumn(var);
101: } else {
102: result = valueOf(var.getValue());
103: }
104: }
105:
106: @Override
107: protected void meetNode(QueryModelNode arg)
108: throws UnsupportedRdbmsOperatorException {
109: throw unsupported(arg);
110: }
111:
112: private SqlExpr valueOf(Value value) {
113: if (value instanceof Literal) {
114: URI datatype = ((Literal) value).getDatatype();
115: if (datatype != null)
116: return str(datatype.stringValue());
117: }
118: return sqlNull();
119: }
120:
121: private SqlExpr type(ValueExpr expr)
122: throws UnsupportedRdbmsOperatorException {
123: return createDatatypeExpr(expr);
124: }
125:
126: }
|