package org.teiid.query.sql.symbol;
import java.util.ArrayList;
import java.util.List;
import org.teiid.api.exception.query.QueryResolverException;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.query.analysis.AnalysisRecord;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.visitor.SQLStringVisitor;
import org.teiid.query.xquery.saxon.SaxonXQueryExpression;
public class XMLQuery implements Expression {
private XMLNamespaces namespaces;
private String xquery;
private List<DerivedColumn> passing = new ArrayList<DerivedColumn>();
private Boolean emptyOnEmpty;
private SaxonXQueryExpression xqueryExpression;
@Override
public Class<?> getType() {
return DataTypeManager.DefaultDataClasses.XML;
}
public Boolean getEmptyOnEmpty() {
return emptyOnEmpty;
}
public void setEmptyOnEmpty(Boolean emptyOnEmpty) {
this.emptyOnEmpty = emptyOnEmpty;
}
public List<DerivedColumn> getPassing() {
return passing;
}
//TODO: display the analysis record info
public void compileXqueryExpression() throws QueryResolverException {
this.xqueryExpression = new SaxonXQueryExpression(xquery, namespaces, passing, null);
this.xqueryExpression.useDocumentProjection(null, new AnalysisRecord(false, false));
}
public SaxonXQueryExpression getXQueryExpression() {
return xqueryExpression;
}
public void setPassing(List<DerivedColumn> passing) {
this.passing = passing;
}
public String getXquery() {
return xquery;
}
public void setXquery(String xquery) {
this.xquery = xquery;
}
public XMLNamespaces getNamespaces() {
return namespaces;
}
public void setNamespaces(XMLNamespaces namespaces) {
this.namespaces = namespaces;
}
@Override
public void acceptVisitor(LanguageVisitor visitor) {
visitor.visit(this);
}
@Override
public XMLQuery clone() {
XMLQuery clone = new XMLQuery();
if (this.namespaces != null) {
clone.namespaces = this.namespaces.clone();
}
if (this.passing != null) {
for (DerivedColumn col : this.passing) {
clone.passing.add(col.clone());
}
}
clone.xquery = this.xquery;
if (this.xqueryExpression != null) {
clone.xqueryExpression = this.xqueryExpression.clone();
}
clone.emptyOnEmpty = this.emptyOnEmpty;
return clone;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof XMLQuery)) {
return false;
}
XMLQuery other = (XMLQuery)obj;
return EquivalenceUtil.areEqual(this.namespaces, other.namespaces)
&& this.passing.equals(other.passing)
&& this.xquery.equals(other.xquery)
&& EquivalenceUtil.areEqual(this.emptyOnEmpty, other.emptyOnEmpty);
}
@Override
public int hashCode() {
return this.xquery.hashCode();
}
@Override
public String toString() {
return SQLStringVisitor.getSQLString(this);
}
}