/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2008.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.sail.rdbms.algebra;
import org.openrdf.model.Resource;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.query.algebra.Var;
import org.openrdf.sail.rdbms.model.RdbmsResource;
import org.openrdf.sail.rdbms.model.RdbmsURI;
import org.openrdf.sail.rdbms.schema.ValueTypes;
/**
* Represents a variable in an SQL expression.
*
* @author James Leigh
*
*/
public class ColumnVar implements Cloneable {
private int index;
private boolean anonymous;
private boolean hidden;
private boolean implied;
private String name;
private Value value;
private String alias;
private String column;
private boolean nullable;
private ValueTypes types;
private ColumnVar() {
}
public static ColumnVar createSubj(String alias, Var v, Resource resource) {
ColumnVar var = new ColumnVar();
var.alias = alias;
var.column = "subj";
var.name = v.getName();
var.anonymous = v.isAnonymous();
var.value = resource;
var.types = ValueTypes.RESOURCE;
if (resource instanceof RdbmsURI) {
var.types = ValueTypes.URI;
}
return var;
}
public static ColumnVar createPred(String alias, Var v, URI uri, boolean implied) {
ColumnVar var = createSubj(alias, v, uri);
var.column = "pred";
var.implied = uri != null && implied;
var.types = ValueTypes.URI;
return var;
}
public static ColumnVar createObj(String alias, Var v, Value value) {
ColumnVar var = new ColumnVar();
var.alias = alias;
var.column = "obj";
var.name = v.getName();
var.anonymous = v.isAnonymous();
var.value = value;
var.types = ValueTypes.UNKNOWN;
if (value instanceof RdbmsURI) {
var.types = ValueTypes.URI;
}
else if (value instanceof RdbmsResource) {
var.types = ValueTypes.RESOURCE;
}
return var;
}
public static ColumnVar createCtx(String alias, Var v, Resource resource) {
ColumnVar var = new ColumnVar();
var.alias = alias;
var.column = "ctx";
if (v == null) {
var.name = "__ctx" + Integer.toHexString(System.identityHashCode(var));
var.anonymous = true;
var.hidden = true;
}
else {
var.name = v.getName();
var.anonymous = v.isAnonymous();
}
var.value = resource;
var.types = ValueTypes.RESOURCE;
if (resource instanceof RdbmsURI) {
var.types = ValueTypes.URI;
}
return var;
}
public ValueTypes getTypes() {
return types;
}
public void setTypes(ValueTypes types) {
this.types = types;
}
public boolean isAnonymous() {
return anonymous;
}
public boolean isHidden() {
return hidden || value != null;
}
public boolean isImplied() {
return implied;
}
public boolean isResource() {
return !types.isLiterals();
}
public boolean isURI() {
return !types.isLiterals() && !types.isBNodes();
}
public boolean isNullable() {
return nullable;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getName() {
return name;
}
public Value getValue() {
return value;
}
public void setValue(Value value) {
this.value = value;
}
public String getColumn() {
return column;
}
public boolean isPredicate() {
return "pred".equals(column);
}
public String getAlias() {
return alias;
}
public ColumnVar as(String name) {
try {
ColumnVar clone = (ColumnVar)super.clone();
clone.name = name;
return clone;
}
catch (CloneNotSupportedException e) {
throw new AssertionError(e);
}
}
public ColumnVar as(String alias, String column) {
try {
ColumnVar clone = (ColumnVar)super.clone();
clone.alias = alias;
clone.column = column;
clone.nullable = true;
return clone;
}
catch (CloneNotSupportedException e) {
throw new AssertionError(e);
}
}
@Override
public boolean equals(Object other) {
if (other instanceof ColumnVar) {
return name.equals(((ColumnVar)other).name);
}
return false;
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(128);
sb.append(alias).append(".").append(column);
sb.append(" (name=").append(name);
if (value != null) {
sb.append(", value=").append(value.toString());
}
sb.append(")");
if (index > 0) {
sb.append("#").append(index);
}
return sb.toString();
}
}