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.sail.rdbms.algebra.base.SqlExprSupport.sqlNull;
009: import static org.openrdf.sail.rdbms.algebra.base.SqlExprSupport.unsupported;
010:
011: import org.openrdf.model.Literal;
012: import org.openrdf.model.URI;
013: import org.openrdf.model.Value;
014: import org.openrdf.model.datatypes.XMLDatatypeUtil;
015: import org.openrdf.query.algebra.Datatype;
016: import org.openrdf.query.algebra.Lang;
017: import org.openrdf.query.algebra.MathExpr;
018: import org.openrdf.query.algebra.QueryModelNode;
019: import org.openrdf.query.algebra.Str;
020: import org.openrdf.query.algebra.ValueConstant;
021: import org.openrdf.query.algebra.ValueExpr;
022: import org.openrdf.query.algebra.Var;
023: import org.openrdf.query.algebra.MathExpr.MathOp;
024: import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
025: import org.openrdf.sail.rdbms.algebra.DoubleValue;
026: import org.openrdf.sail.rdbms.algebra.NumericColumn;
027: import org.openrdf.sail.rdbms.algebra.SqlMathExpr;
028: import org.openrdf.sail.rdbms.algebra.SqlNull;
029: import org.openrdf.sail.rdbms.algebra.base.SqlExpr;
030: import org.openrdf.sail.rdbms.exceptions.UnsupportedRdbmsOperatorException;
031:
032: /**
033: * Creates an SQL expression of a literal's numeric value.
034: *
035: * @author James Leigh
036: *
037: */
038: public class NumericExprFactory extends
039: QueryModelVisitorBase<UnsupportedRdbmsOperatorException> {
040: protected SqlExpr result;
041:
042: public SqlExpr createNumericExpr(ValueExpr expr)
043: throws UnsupportedRdbmsOperatorException {
044: result = null;
045: if (expr == null)
046: return new SqlNull();
047: expr.visit(this );
048: if (result == null)
049: return new SqlNull();
050: return result;
051: }
052:
053: @Override
054: public void meet(Datatype node) {
055: result = sqlNull();
056: }
057:
058: @Override
059: public void meet(Lang node)
060: throws UnsupportedRdbmsOperatorException {
061: result = sqlNull();
062: }
063:
064: @Override
065: public void meet(MathExpr node)
066: throws UnsupportedRdbmsOperatorException {
067: SqlExpr left = createNumericExpr(node.getLeftArg());
068: SqlExpr right = createNumericExpr(node.getRightArg());
069: MathOp op = node.getOperator();
070: result = new SqlMathExpr(left, op, right);
071: }
072:
073: @Override
074: public void meet(Str node) {
075: result = sqlNull();
076: }
077:
078: @Override
079: public void meet(ValueConstant vc) {
080: result = valueOf(vc.getValue());
081: }
082:
083: @Override
084: public void meet(Var var) {
085: if (var.getValue() == null) {
086: result = new NumericColumn(var);
087: } else {
088: result = valueOf(var.getValue());
089: }
090: }
091:
092: @Override
093: protected void meetNode(QueryModelNode arg)
094: throws UnsupportedRdbmsOperatorException {
095: throw unsupported(arg);
096: }
097:
098: private SqlExpr valueOf(Value value) {
099: if (value instanceof Literal) {
100: Literal lit = (Literal) value;
101: URI dt = lit.getDatatype();
102: if (dt != null && XMLDatatypeUtil.isNumericDatatype(dt)) {
103: try {
104: return new DoubleValue(lit.doubleValue());
105: } catch (NumberFormatException e) {
106: return null;
107: }
108: }
109: }
110: return null;
111: }
112:
113: }
|