package com.bagri.xquery.saxon.ext.doc;
import static com.bagri.core.Constants.bg_ns;
import static com.bagri.core.Constants.bg_schema;
import static com.bagri.core.Constants.cmd_query_document_uris;
import static com.bagri.xquery.saxon.SaxonUtils.sequence2Properties;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import com.bagri.core.api.QueryManagement;
import com.bagri.core.api.BagriException;
import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.lib.ExtensionFunctionDefinition;
import net.sf.saxon.om.AtomicArray;
import net.sf.saxon.om.Item;
import net.sf.saxon.om.Sequence;
import net.sf.saxon.om.SequenceIterator;
import net.sf.saxon.om.SequenceTool;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.value.AtomicValue;
import net.sf.saxon.value.SequenceType;
import net.sf.saxon.value.StringValue;
public class QueryDocumentUris extends ExtensionFunctionDefinition {
protected QueryManagement qm;
public QueryDocumentUris(QueryManagement qm) {
this.qm = qm;
}
@Override
public StructuredQName getFunctionQName() {
return new StructuredQName(bg_schema, bg_ns, cmd_query_document_uris);
}
@Override
public int getMinimumNumberOfArguments() {
return 2;
}
@Override
public int getMaximumNumberOfArguments() {
return 3;
}
@Override
public SequenceType[] getArgumentTypes() {
return new SequenceType[] {SequenceType.SINGLE_STRING, SequenceType.ANY_SEQUENCE, SequenceType.ATOMIC_SEQUENCE};
}
@Override
public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) {
return SequenceType.STRING_SEQUENCE;
}
public static Map<String, Object> sequence2Params(Sequence sq) throws XPathException {
SequenceIterator itr = sq.iterate();
Map<String, Object> params = new HashMap<>();
do {
Item item = itr.next();
if (item != null) {
String name = item.getStringValue();
Object value = null;
item = itr.next();
if (item != null) {
value = SequenceTool.convertToJava(item);
}
params.put(name, value);
} else {
break;
}
} while (true);
return params;
}
@Override
public ExtensionFunctionCall makeCallExpression() {
return new ExtensionFunctionCall() {
@Override
public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
String query = arguments[0].head().getStringValue();
Map<String, Object> params = sequence2Params(arguments[1]);
Properties props = null;
if (arguments.length > 2) {
props = sequence2Properties(arguments[2]);
}
try {
Collection<String> uris = qm.getDocumentUris(query, params, props);
ArrayList<AtomicValue> list = new ArrayList<>(uris.size());
for (String uri: uris) {
list.add(new StringValue(uri));
}
return new AtomicArray(list);
} catch (BagriException ex) {
throw new XPathException(ex);
}
}
};
}
}