package org.aksw.sparqlify.algebra.sql.exprs2;
import org.aksw.sparqlify.core.TypeToken;
import org.aksw.sparqlify.core.cast.SqlValue;
import org.apache.jena.atlas.io.IndentedWriter;
import org.apache.jena.datatypes.TypeMapper;
public class S_Constant
extends SqlExprConstantBase
{
public static final S_Constant TRUE = new S_Constant(SqlValue.TRUE);
public static final S_Constant FALSE = new S_Constant(SqlValue.FALSE);
public static final TypeMapper typeMapper = TypeMapper.getInstance();
// TODO I am still not sure whether type-errors should be modeled as datatypes
// or as exceptions being thrown during evaluation.
// The advantage of using datatype is, that e.g. logical operators can consider
// them during evaluation.
public static final S_Constant TYPE_ERROR = new S_Constant(SqlValue.TYPE_ERROR); //SparqlifyConstants.nvTypeError);
//private NodeValue value;
private SqlValue value;
/**
* TODO The question is whether S_Constant arguments should be NodeValues or Object-datatype pairs
* Variables are eventually just type tokens (e.g. int or maybe sql:int) wheras constants are xsd:int.
* Actually, we just have to register sql:int for jena to recognize it as an integer.
*
*
* @param value
*/
public S_Constant(SqlValue value) {
super(value.getTypeToken());
this.value = value;
}
public static S_Constant create(SqlValue value) {
S_Constant result = new S_Constant(value);
return result;
}
// public S_Constant(TypeToken typeToken, NodeValue value) {
// super(typeToken);
// this.value = value;
// }
// public static S_Constant create(NodeValue value) {
// Node node = value.asNode();
// if(!node.isLiteral()) {
// throw new RuntimeException("Literal expected; got: " + value);
// }
//
// String typeUri = node.getLiteralDatatypeURI();
// TypeToken typeToken;
// if(typeUri == null) {
// typeToken = TypeToken.String;
// }
// else {
// typeToken = TypeToken.alloc(typeUri);
// }
//
// S_Constant result = new S_Constant(typeToken, value);
// return result;
// }
// For null values
public S_Constant(TypeToken typeName) {
super(typeName);
this.value = new SqlValue(typeName, null);
}
/**
* For use in logical operators: value becomes a discriminator value
*
* @param typeToken
* @param value
*/
@Deprecated
public S_Constant(TypeToken typeName, String value) {
super(typeName);
this.value = new SqlValue(typeName, value);
// this.value = NodeValue.makeString(value);
//throw new RuntimeException("Deprecated");
}
public SqlValue getValue()
{
return value;
}
@Override
public void asString(IndentedWriter writer) {
writer.print("" + value);
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
S_Constant other = (S_Constant) obj;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
/*
@Override
public <T> T getValue() {
Object tmp = NodeValueUtilsSparqlify.getValue(nodeValue);
T tmp = (T)
}
*/
@Override
public <T> T accept(SqlExprVisitor<T> visitor) {
T result = visitor.visit(this);
return result;
}
}
/**
* Experimental class:
*
* @author Claus Stadler <cstadler@informatik.uni-leipzig.de>
*
*/
//class S_ConstantOld
// extends SqlExprConstantBase
//{
// public static final S_Constant TRUE = new S_Constant(NodeValue.TRUE);
// public static final S_Constant FALSE = new S_Constant(NodeValue.FALSE);
//
// public static final TypeMapper typeMapper = TypeMapper.getInstance();
//
// // TODO I am still not sure whether type-errors should be modeled as datatypes
// // or as exceptions being thrown during evaluation.
// // The advantage of using datatype is, that e.g. logical operators can consider
// // them during evaluation.
// public static final S_Constant TYPE_ERROR = new S_Constant(SparqlifyConstants.nvTypeError);
//
// private NodeValue value;
//
// /**
// * TODO The question is whether S_Constant arguments should be NodeValues or Object-datatype pairs
// * Variables are eventually just type tokens (e.g. int or maybe sql:int) wheras constants are xsd:int.
// * Actually, we just have to register sql:int for jena to recognize it as an integer.
// *
// *
// * @param value
// */
// public S_Constant(NodeValue value) {
// super(TypeToken.alloc(value.asNode().getLiteralDatatypeURI()));
// this.value = value;
// }
//
//
// public S_Constant(TypeToken typeToken, NodeValue value) {
// super(typeToken);
// this.value = value;
// }
//
//
// public static S_Constant create(NodeValue value) {
// Node node = value.asNode();
// if(!node.isLiteral()) {
// throw new RuntimeException("Literal expected; got: " + value);
// }
//
// String typeUri = node.getLiteralDatatypeURI();
// TypeToken typeToken;
// if(typeUri == null) {
// typeToken = TypeToken.String;
// }
// else {
// typeToken = TypeToken.alloc(typeUri);
// }
//
// S_Constant result = new S_Constant(typeToken, value);
// return result;
// }
//
// // For null values
// public S_Constant(TypeToken typeName) {
// super(typeName);
// }
//
// /**
// * For use in logical operators: value becomes a discriminator value
// *
// * @param typeToken
// * @param value
// */
// @Deprecated
// public S_Constant(TypeToken typeName, String value) {
// super(typeName);
// this.value = NodeValue.makeString(value);
// }
//
//
// public NodeValue getValue()
// {
// return value;
// }
//
//
// @Override
// public void asString(IndentedWriter writer) {
// writer.print(value);
// }
//
// @Override
// public int hashCode() {
// final int prime = 31;
// int result = super.hashCode();
// result = prime * result + ((value == null) ? 0 : value.hashCode());
// return result;
// }
//
// @Override
// public boolean equals(Object obj) {
// if (this == obj)
// return true;
// if (!super.equals(obj))
// return false;
// if (getClass() != obj.getClass())
// return false;
// S_Constant other = (S_Constant) obj;
// if (value == null) {
// if (other.value != null)
// return false;
// } else if (!value.equals(other.value))
// return false;
// return true;
// }
//
//
//
// /*
// @Override
// public <T> T getValue() {
// Object tmp = NodeValueUtilsSparqlify.getValue(nodeValue);
// T tmp = (T)
// }
// */
//}