/*
* Copyright (c) 2013-2015 Josef Hardi <josef.hardi@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.obidea.semantika.expression;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import com.obidea.semantika.datatype.DataType;
import com.obidea.semantika.expression.base.Atom;
import com.obidea.semantika.expression.base.Function;
import com.obidea.semantika.expression.base.FunctionSymbol;
import com.obidea.semantika.expression.base.IAtom;
import com.obidea.semantika.expression.base.IPredicate;
import com.obidea.semantika.expression.base.ITerm;
import com.obidea.semantika.expression.base.IVariable;
import com.obidea.semantika.expression.base.Literal;
import com.obidea.semantika.expression.base.Predicate;
import com.obidea.semantika.expression.base.Query;
import com.obidea.semantika.expression.base.Rule;
import com.obidea.semantika.expression.base.Term;
import com.obidea.semantika.expression.base.TermUtils;
import com.obidea.semantika.expression.base.UriReference;
import com.obidea.semantika.expression.base.Variable;
public class ExpressionObjectFactory implements IExpressionObjectFactory
{
private static ExpressionObjectFactory sInstance;
public static ExpressionObjectFactory getInstance()
{
if (sInstance == null) {
sInstance = new ExpressionObjectFactory();
}
return sInstance;
}
public Query createQuery(IAtom... body)
{
return createQuery(false, Arrays.asList(body));
}
public Query createQuery(boolean isDistinct, IAtom... body)
{
return createQuery(isDistinct, Arrays.asList(body));
}
public Query createQuery(List<? extends IAtom> body)
{
return createQuery(false, body);
}
@Override
public Query createQuery(boolean isDistinct, List<? extends IAtom> body)
{
Query query = new Query(isDistinct);
for (IAtom atom : body) {
query.addAtom(atom);
}
return query;
}
public Rule createRule(IAtom head, IAtom... body)
{
return createRule(head, Arrays.asList(body));
}
@Override
public Rule createRule(IAtom head, List<? extends IAtom> body)
{
IPredicate rulePredicate = head.getPredicate();
Rule rule = new Rule(rulePredicate);
for (ITerm term : head.getTerms()) {
if (term instanceof IVariable) {
IVariable var = (IVariable) term;
rule.addDistVar(var);
}
}
for (IAtom atom : body) {
rule.addAtom(atom);
}
return rule;
}
public Atom createAtom(String name, ITerm... terms)
{
return createAtom(name, Arrays.asList(terms));
}
@Override
public Atom createAtom(String name, List<? extends ITerm> terms)
{
List<Term> termList = new ArrayList<Term>();
for (ITerm t : terms) {
termList.add((Term) t);
}
return new Atom(getPredicate(name), termList);
}
@Override
public Predicate getPredicate(String name)
{
return new Predicate(name);
}
@Override
public Variable getVariable(String name)
{
return (Variable) TermUtils.makeVariable(name);
}
@Override
public Variable getVariable(String name, String datatype)
{
return (Variable) TermUtils.makeTypedVariable(name, datatype);
}
@Override
public Literal getLiteral(String value, String datatype)
{
return (Literal) TermUtils.makeTypedLiteral(value, datatype);
}
@Override
public Literal getLiteral(String value)
{
return (Literal) TermUtils.makeTypedLiteral(value, DataType.STRING);
}
@Override
public Literal getLiteral(boolean value)
{
return (Literal) TermUtils.makeTypedLiteral(value ? "true" : "false", DataType.BOOLEAN);
}
@Override
public Literal getLiteral(double value)
{
return (Literal) TermUtils.makeTypedLiteral(String.valueOf(value), DataType.DOUBLE);
}
@Override
public Literal getLiteral(float value)
{
return (Literal) TermUtils.makeTypedLiteral(String.valueOf(value), DataType.FLOAT);
}
@Override
public Literal getLiteral(BigInteger value)
{
return (Literal) TermUtils.makeTypedLiteral(String.valueOf(value), DataType.INTEGER);
}
@Override
public Literal getLiteral(BigDecimal value)
{
return (Literal) TermUtils.makeTypedLiteral(String.valueOf(value), DataType.DECIMAL);
}
@Override
public Literal getLiteral(long value)
{
return (Literal) TermUtils.makeTypedLiteral(String.valueOf(value), DataType.LONG);
}
@Override
public Literal getLiteral(int value)
{
return (Literal) TermUtils.makeTypedLiteral(String.valueOf(value), DataType.INT);
}
@Override
public Literal getLiteral(short value)
{
return (Literal) TermUtils.makeTypedLiteral(String.valueOf(value), DataType.SHORT);
}
@Override
public Literal getLiteral(byte value)
{
return (Literal) TermUtils.makeTypedLiteral(String.valueOf(value), DataType.BYTE);
}
@Override
public Literal getDate(XMLGregorianCalendar value)
{
final QName schemaType = DatatypeConstants.DATE;
if(!schemaType.equals(value.getXMLSchemaType())) {
throw new IllegalArgumentException();
}
return (Literal) TermUtils.makeTypedLiteral(value.toXMLFormat(), DataType.DATE);
}
@Override
public Literal getTime(XMLGregorianCalendar value)
{
final QName schemaType = DatatypeConstants.TIME;
if(!schemaType.equals(value.getXMLSchemaType())) {
throw new IllegalArgumentException();
}
return (Literal) TermUtils.makeTypedLiteral(value.toXMLFormat(), DataType.TIME);
}
@Override
public Literal getDateTime(XMLGregorianCalendar value)
{
final QName schemaType = DatatypeConstants.DATETIME;
if(!schemaType.equals(value.getXMLSchemaType())) {
throw new IllegalArgumentException();
}
return (Literal) TermUtils.makeTypedLiteral(value.toXMLFormat(), DataType.DATE_TIME);
}
@Override
public Literal getPlainLiteral(String value)
{
return (Literal) TermUtils.makePlainLiteral(value);
}
@Override
public Literal getPlainLiteral(String value, String lang)
{
return (Literal) TermUtils.makePlainLiteral(value, lang);
}
@Override
public UriReference getUriReference(URI uri)
{
return (UriReference) TermUtils.makeUriReference(uri.toString());
}
@Override
public Function getFunction(FunctionSymbol functionSymbol, List<? extends ITerm> parameters)
{
List<Term> parameterList = new ArrayList<Term>();
for (ITerm p : parameters) {
parameterList.add((Term) p);
}
return (Function) TermUtils.makeFunction(functionSymbol, parameterList);
}
@Override
public Function formAnd(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeAnd((Term) t1, (Term) t2);
}
@Override
public Function formOr(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeOr((Term) t1, (Term) t2);
}
@Override
public Function formNot(ITerm t)
{
return (Function) TermUtils.makeNot((Term) t);
}
@Override
public Function formEq(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeEqual((Term) t1, (Term) t2);
}
@Override
public Function formNeq(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeNotEqual((Term) t1, (Term) t2);
}
@Override
public Function formGt(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeGreaterThan((Term) t1, (Term) t2);
}
@Override
public Function formGte(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeGreaterThanAndEqualTo((Term) t1, (Term) t2);
}
@Override
public Function formLt(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeLessThan((Term) t1, (Term) t2);
}
@Override
public Function formLte(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeLessThanAndEqualTo((Term) t1, (Term) t2);
}
@Override
public Function formIsNull(ITerm t)
{
return (Function) TermUtils.makeIsNull((Term) t);
}
@Override
public Function formIsNotNull(ITerm t)
{
return (Function) TermUtils.makeIsNotNull((Term) t);
}
@Override
public Function formAddition(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeAdd((Term) t1, (Term) t2);
}
@Override
public Function formSubtraction(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeSubstract((Term) t1, (Term) t2);
}
@Override
public Function formMultiplication(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeMultiply((Term) t1, (Term) t2);
}
@Override
public Function formDivision(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeDivide((Term) t1, (Term) t2);
}
@Override
public Function formStringConcat(ITerm t1, ITerm t2)
{
return (Function) TermUtils.makeConcat((Term) t1, (Term) t2);
}
public Function formRegex(ITerm text, ITerm pattern, ITerm flag)
{
return (Function) TermUtils.makeRegex((Term) text, (Term) pattern, (Term) flag);
}
public Function formLang(ITerm t)
{
return (Function) TermUtils.makeLang((Term) t);
}
@Override
public Function formStr(ITerm t)
{
return (Function) TermUtils.makeStr((Term) t);
}
/*
* Prevent external instantiation
*/
private ExpressionObjectFactory()
{
// NO-OP
}
}