Search in sources :

Example 1 with NameFilter

use of org.sirix.index.name.NameFilter in project sirix by sirixdb.

the class ScanNameIndex method execute.

@Override
public Sequence execute(StaticContext sctx, QueryContext ctx, Sequence[] args) throws QueryException {
    final DBNode doc = ((DBNode) args[0]);
    final XdmNodeReadTrx rtx = doc.getTrx();
    final IndexController controller = rtx.getResourceManager().getRtxIndexController(rtx.getRevisionNumber());
    if (controller == null) {
        throw new QueryException(new QNm("Document not found: " + ((Str) args[1]).stringValue()));
    }
    final int idx = FunUtil.getInt(args, 1, "$idx-no", -1, null, true);
    final IndexDef indexDef = controller.getIndexes().getIndexDef(idx, IndexType.NAME);
    if (indexDef == null) {
        throw new QueryException(SDBFun.ERR_INDEX_NOT_FOUND, "Index no %s for collection %s and document %s not found.", idx, doc.getCollection().getName(), doc.getTrx().getResourceManager().getResourceConfig().getResource().getFileName().toString());
    }
    if (indexDef.getType() != IndexType.NAME) {
        throw new QueryException(SDBFun.ERR_INVALID_INDEX_TYPE, "Index no %s for collection %s and document %s is not a path index.", idx, doc.getCollection().getName(), doc.getTrx().getResourceManager().getResourceConfig().getResource().getFileName().toString());
    }
    final String names = FunUtil.getString(args, 2, "$names", null, null, false);
    final NameFilter filter = (names != null) ? controller.createNameFilter(names.split(";")) : null;
    final IndexController ic = controller;
    final DBNode node = doc;
    return new LazySequence() {

        @Override
        public Iter iterate() {
            return new BaseIter() {

                Stream<?> s;

                @Override
                public Item next() throws QueryException {
                    if (s == null) {
                        s = new SirixNodeKeyStream(ic.openNameIndex(node.getTrx().getPageTrx(), indexDef, filter), node.getCollection(), node.getTrx());
                    }
                    return (Item) s.next();
                }

                @Override
                public void close() {
                    if (s != null) {
                        s.close();
                    }
                }
            };
        }
    };
}
Also used : SirixNodeKeyStream(org.sirix.xquery.stream.SirixNodeKeyStream) XdmNodeReadTrx(org.sirix.api.XdmNodeReadTrx) IndexController(org.sirix.access.IndexController) DBNode(org.sirix.xquery.node.DBNode) BaseIter(org.brackit.xquery.sequence.BaseIter) QNm(org.brackit.xquery.atomic.QNm) Item(org.brackit.xquery.xdm.Item) QueryException(org.brackit.xquery.QueryException) NameFilter(org.sirix.index.name.NameFilter) Stream(org.brackit.xquery.xdm.Stream) SirixNodeKeyStream(org.sirix.xquery.stream.SirixNodeKeyStream) IndexDef(org.sirix.index.IndexDef) LazySequence(org.brackit.xquery.sequence.LazySequence)

Aggregations

QueryException (org.brackit.xquery.QueryException)1 QNm (org.brackit.xquery.atomic.QNm)1 BaseIter (org.brackit.xquery.sequence.BaseIter)1 LazySequence (org.brackit.xquery.sequence.LazySequence)1 Item (org.brackit.xquery.xdm.Item)1 Stream (org.brackit.xquery.xdm.Stream)1 IndexController (org.sirix.access.IndexController)1 XdmNodeReadTrx (org.sirix.api.XdmNodeReadTrx)1 IndexDef (org.sirix.index.IndexDef)1 NameFilter (org.sirix.index.name.NameFilter)1 DBNode (org.sirix.xquery.node.DBNode)1 SirixNodeKeyStream (org.sirix.xquery.stream.SirixNodeKeyStream)1