package lux.saxon;
import lux.index.IndexConfiguration;
import lux.query.SpanMatchAll;
import lux.xml.QName;
import lux.xpath.AbstractExpression;
import lux.xpath.ExpressionVisitorBase;
import lux.xpath.FunCall;
import lux.xpath.LiteralExpression;
import lux.xquery.XQuery;
public class UnOptimizer extends ExpressionVisitorBase {
private static final QName luxSearchQName = new QName (FunCall.LUX_NAMESPACE, "search", "lux");
private final IndexConfiguration indexConfig;
public UnOptimizer (IndexConfiguration indexConfig) {
this.indexConfig = indexConfig;
}
public AbstractExpression unoptimize (AbstractExpression aex) {
aex.accept(this);
return aex;
}
@Override
public AbstractExpression visit(FunCall func) {
if (func.getName().equals(luxSearchQName)) {
if (indexConfig.isOption (IndexConfiguration.INDEX_PATHS)) {
func.getSubs()[0] = SpanMatchAll.getInstance().toXmlNode("lux_path", indexConfig);
} else {
func.getSubs()[0] = new LiteralExpression ("*:*");
}
}
return func;
}
public XQuery unoptimize(XQuery xquery) {
AbstractExpression body = unoptimize(xquery.getBody());
return new XQuery (xquery.getDefaultElementNamespace(), xquery.getDefaultFunctionNamespace(), xquery.getDefaultCollation(),
xquery.getModuleImports(), xquery.getNamespaceDeclarations(), xquery.getVariableDefinitions(), xquery.getFunctionDefinitions(),
body, xquery.getBaseURI(), xquery.isPreserveNamespaces(), xquery.isInheritNamespaces(), xquery.isEmptyLeast());
}
}
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */