package com.mysema.rdfbean.rdb;
import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.Function;
import com.mysema.query.types.Constant;
import com.mysema.query.types.Expression;
import com.mysema.query.types.FactoryExpression;
import com.mysema.query.types.Visitor;
import com.mysema.rdfbean.model.BID;
import com.mysema.rdfbean.model.ID;
import com.mysema.rdfbean.model.NODE;
import com.mysema.rdfbean.model.PatternBlock;
import com.mysema.rdfbean.model.STMT;
import com.mysema.rdfbean.model.UID;
public class STMTFactoryExpression implements FactoryExpression<STMT> {
private static final long serialVersionUID = 2264837934860429836L;
private final List<Expression<?>> args;
private final Function<Long, NODE> function;
@Nullable
private final ID subject;
@Nullable
private final UID predicate;
@Nullable
private final NODE object;
@Nullable
private final UID context;
public STMTFactoryExpression(PatternBlock pattern, List<Expression<?>> args, Function<Long, NODE> function) {
this.args = args;
this.function = function;
this.subject = (ID) getConstant(pattern.getSubject());
this.predicate = (UID) getConstant(pattern.getPredicate());
this.object = getConstant(pattern.getObject());
this.context = (UID) getConstant(pattern.getContext());
}
@Nullable
private NODE getConstant(Expression<?> expr) {
if (expr instanceof Constant<?>) {
return (NODE) ((Constant<?>) expr).getConstant();
} else {
return null;
}
}
@Override
public List<Expression<?>> getArgs() {
return args;
}
@Override
public STMT newInstance(Object... args) {
int counter = 0;
ID s = subject != null ? subject : getId(args[counter++]);
UID p = predicate != null ? predicate : (UID) getId(args[counter++]);
NODE o = object != null ? object : function.apply((Long) args[counter++]);
UID c = context;
if (args.length > counter && c != null) {
c = (UID) getId(args[counter++]);
}
return new STMT(s, p, o, c);
}
private ID getId(Object input) {
if (input instanceof Long) {
return (ID) function.apply((Long) input);
} else {
String val = input.toString();
return val.contains(":") ? new UID(val) : new BID(val);
}
}
@Override
public <R, C> R accept(Visitor<R, C> v, C context) {
return v.visit(this, context);
}
@Override
public Class<? extends STMT> getType() {
return STMT.class;
}
}