use of org.sirix.index.IndexDef in project sirix by sirixdb.
the class IndexController method containsIndex.
/**
* Determines if an index of the specified type is available.
*
* @param type type of index to lookup
* @param resourceManager the {@link ResourceManager} this index controller is bound to
* @return {@code true} if an index of the specified type exists, {@code false} otherwise
* @throws SirixIOException if an I/O exception occurs while deserializing the index configuration
* for the specified {@code revision}
*/
public boolean containsIndex(final IndexType type, final ResourceManager resourceManager, final int revision) throws SirixIOException {
final Indexes indexes = new Indexes();
final java.nio.file.Path indexesFile = resourceManager.getResourceConfig().mPath.resolve(ResourceConfiguration.ResourcePaths.INDEXES.getFile() + String.valueOf(revision) + ".xml");
try {
if (Files.exists(indexesFile) && Files.size(indexesFile) > 0) {
try (final InputStream in = new FileInputStream(indexesFile.toFile())) {
indexes.init(deserialize(in).getFirstChild());
}
}
} catch (IOException | DocumentException | SirixException e) {
throw new SirixIOException("Index definitions couldn't be deserialized!", e);
}
for (final IndexDef indexDef : indexes.getIndexDefs()) {
if (indexDef.getType() == type)
return true;
}
return false;
}
use of org.sirix.index.IndexDef in project sirix by sirixdb.
the class XQueryUsage method loadDocumentAndQueryTemporal.
/**
* Load a document and query it (temporal enhancements).
*/
private static void loadDocumentAndQueryTemporal() throws QueryException, IOException, SirixException {
// Initialize query context and store (implicit transaction commit).
try (final DBStore store = DBStore.newBuilder().build()) {
final QueryContext ctx1 = new SirixQueryContext(store);
final CompileChain compileChain = new SirixCompileChain(store);
final Path doc1 = generateSampleDoc("sample1");
final URI docUri = doc1.toUri();
// Use XQuery to load sample document into store.
System.out.println("Loading document:");
final String xq1 = String.format("sdb:load('mydocs.col', 'resource1', '%s')", docUri.toString());
System.out.println(xq1);
new XQuery(compileChain, xq1).evaluate(ctx1);
}
try (final DBStore store = DBStore.newBuilder().build()) {
final QueryContext ctx = new QueryContext(store);
System.out.println();
System.out.println("Query loaded document:");
final String xq3 = "let $doc:= doc('mydocs.col')/log return sdb:select-node($doc, 7) ";
System.out.println(xq3);
XQuery q = new XQuery(new SirixCompileChain(store), xq3);
q.prettyPrint();
q.serialize(ctx, System.out);
}
try (final DBStore store = DBStore.newBuilder().build()) {
final QueryContext ctx = new SirixQueryContext(store);
System.out.println();
System.out.println("Query loaded document:");
final String xq3 = "doc('mydocs.col')/log/all-time::*";
System.out.println(xq3);
XQuery q = new XQuery(new SirixCompileChain(store), xq3);
q.prettyPrint();
q.serialize(ctx, System.out);
}
// Create and commit CAS indexes on all attribute- and text-nodes.
try (final DBStore store = DBStore.newBuilder().build()) {
final QueryContext ctx3 = new QueryContext(store);
System.out.println();
System.out.println("Create a cas index for all attributes and another one for text-nodes. A third one is created for all integers:");
final XQuery q = new XQuery(new SirixCompileChain(store), "let $doc := sdb:doc('mydocs.col', 'resource1', (), fn:boolean(1)) " + "let $casStats1 := sdb:create-cas-index($doc, 'xs:string', '//@*') " + "let $casStats2 := sdb:create-cas-index($doc, 'xs:string', '//*') " + "let $casStats3 := sdb:create-cas-index($doc, 'xs:integer', '//*') " + "return <rev>{sdb:commit($doc)}</rev>");
q.serialize(ctx3, System.out);
System.out.println();
System.out.println("CAS index creation done.");
}
// Create and commit path index on all elements.
try (final DBStore store = DBStore.newBuilder().build()) {
final QueryContext ctx3 = new QueryContext(store);
System.out.println();
System.out.println("Create path index for all elements (all paths):");
final XQuery q = new XQuery(new SirixCompileChain(store), "let $doc := sdb:doc('mydocs.col', 'resource1', (), fn:boolean(1)) " + "let $stats := sdb:create-path-index($doc, '//*') " + "return <rev>{sdb:commit($doc)}</rev>");
q.serialize(ctx3, System.out);
System.out.println();
System.out.println("Path index creation done.");
}
// Create and commit name index on all elements with QName 'src' or 'msg'.
try (final DBStore store = DBStore.newBuilder().build()) {
final QueryContext ctx3 = new SirixQueryContext(store, CommitStrategy.EXPLICIT);
System.out.println();
System.out.println("Create name index for all elements with name 'src' or 'msg':");
final XQuery q = new XQuery(new SirixCompileChain(store), "let $doc := sdb:doc('mydocs.col', 'resource1', (), fn:boolean(1)) " + "let $stats := sdb:create-name-index($doc, fn:QName((), 'src')) " + "return <rev>{sdb:commit($doc)}</rev>");
q.serialize(ctx3, System.out);
System.out.println();
System.out.println("Name index creation done.");
}
// Query CAS index.
try (final DBStore store = DBStore.newBuilder().build()) {
System.out.println("");
System.out.println("Find CAS index for all attribute values.");
final QueryContext ctx3 = new SirixQueryContext(store);
final String query = "let $doc := sdb:doc('mydocs.col', 'resource1') return sdb:scan-cas-index($doc, sdb:find-cas-index($doc, 'xs:string', '//@*'), 'bar', true(), 0, ())";
final Sequence seq = new XQuery(new SirixCompileChain(store), query).execute(ctx3);
// final Iter iter = seq.iterate();
// for (Item item = iter.next(); item != null; item = iter.next()) {
// System.out.println(item);
// }
final Comparator<Tuple> comparator = (o1, o2) -> ((Node<?>) o1).cmp((Node<?>) o2);
final Sequence sortedSeq = new SortedNodeSequence(comparator, seq, true);
final Iter sortedIter = sortedSeq.iterate();
System.out.println("Sorted index entries in document order: ");
for (Item item = sortedIter.next(); item != null; item = sortedIter.next()) {
System.out.println(item);
}
}
// Query CAS index.
try (final DBStore store = DBStore.newBuilder().build()) {
System.out.println("");
System.out.println("Find CAS index for all text values which are integers between 10 and 100.");
final QueryContext ctx3 = new SirixQueryContext(store);
final String query = "let $doc := sdb:doc('mydocs.col', 'resource1') return sdb:scan-cas-index-range($doc, sdb:find-cas-index($doc, 'xs:integer', '//*'), 10, 100, true(), true(), ())";
final Sequence seq = new XQuery(new SirixCompileChain(store), query).execute(ctx3);
// final Iter iter = seq.iterate();
// for (Item item = iter.next(); item != null; item = iter.next()) {
// System.out.println(item);
// }
final Comparator<Tuple> comparator = (o1, o2) -> ((Node<?>) o1).cmp((Node<?>) o2);
final Sequence sortedSeq = new SortedNodeSequence(comparator, seq, true);
final Iter sortedIter = sortedSeq.iterate();
System.out.println("Sorted index entries in document order: ");
for (Item item = sortedIter.next(); item != null; item = sortedIter.next()) {
System.out.println(item);
}
}
// Query path index which are children of the log-element (only elements).
try (final DBStore store = DBStore.newBuilder().build()) {
System.out.println("");
System.out.println("Find path index for all elements which are children of the log-element (only elements).");
final QueryContext ctx3 = new SirixQueryContext(store);
final DBNode node = (DBNode) new XQuery(new SirixCompileChain(store), "doc('mydocs.col')").execute(ctx3);
final Optional<IndexDef> index = node.getTrx().getResourceManager().getRtxIndexController(node.getTrx().getRevisionNumber()).getIndexes().findPathIndex(org.brackit.xquery.util.path.Path.parse("//log/*"));
System.out.println(index);
// last param '()' queries whole index.
final String query = "let $doc := sdb:doc('mydocs.col', 'resource1') " + "return sdb:scan-path-index($doc, " + index.get().getID() + ", '//log/*')";
final Sequence seq = new XQuery(new SirixCompileChain(store), query).execute(ctx3);
final Comparator<Tuple> comparator = (o1, o2) -> ((Node<?>) o1).cmp((Node<?>) o2);
final Sequence sortedSeq = new SortedNodeSequence(comparator, seq, true);
final Iter sortedIter = sortedSeq.iterate();
System.out.println("Sorted index entries in document order: ");
for (Item item = sortedIter.next(); item != null; item = sortedIter.next()) {
System.out.println(item);
}
}
// Query name index.
try (final DBStore store = DBStore.newBuilder().build()) {
System.out.println("");
System.out.println("Query name index (src-element).");
final QueryContext ctx3 = new QueryContext(store);
final String query = "let $doc := sdb:doc('mydocs.col', 'resource1')" + " let $sequence := sdb:scan-name-index($doc, sdb:find-name-index($doc, fn:QName((), 'src')), fn:QName((), 'src'))" + " return sdb:sort($sequence)";
final XQuery q = new XQuery(new SirixCompileChain(store), query);
q.prettyPrint();
q.serialize(ctx3, System.out);
}
try (final DBStore store = DBStore.newBuilder().build()) {
final QueryContext ctx = new SirixQueryContext(store);
System.out.println();
System.out.println("Query loaded document:");
final String xq3 = "doc('mydocs.col')/log/all-time::*";
System.out.println(xq3);
XQuery q = new XQuery(new SirixCompileChain(store), xq3);
q.prettyPrint();
q.serialize(ctx, System.out);
// Serialize first version to XML
// ($user.home$/sirix-data/output-revision-1.xml).
final QueryContext ctx4 = new QueryContext(store);
final String xq4 = "doc('mydocs.col', 1)";
q = new XQuery(xq4);
try (final PrintStream out = new PrintStream(new FileOutputStream(LOCATION.resolve("output-revision-1.xml").toFile()))) {
q.prettyPrint().serialize(ctx4, out);
}
System.out.println();
// Serialize second version to XML
// ($user.home$/sirix-data/output-revision-1.xml).
final QueryContext ctx5 = new SirixQueryContext(store);
final String xq5 = "sdb:serialize(doc('mydocs.col', 2), fn:boolean(1), 'output-revision-2.xml')";
q = new XQuery(xq5);
q.execute(ctx5);
System.out.println();
// Serialize first, second and third version to XML
// ($user.home$/sirix-data/output-revisions.xml).
final QueryContext ctx6 = new SirixQueryContext(store);
final String xq6 = "for $i in ((doc('mydocs.col', 1), doc('mydocs.col', 2), doc('mydocs.col', 3))) return $i";
q = new XQuery(xq6);
try (final PrintStream out = new PrintStream(new FileOutputStream(LOCATION.resolve("output-revisions.xml").toFile()))) {
q.prettyPrint().serialize(ctx6, out);
}
System.out.println();
}
try (final DBStore store = DBStore.newBuilder().build()) {
final Path doc = Paths.get("src", "main", "resources", "test.xml");
final QueryContext ctx = new SirixQueryContext(store);
System.out.println();
final String xq3 = String.format("sdb:load('mycoll.col', 'mydoc.xml', '%s')", doc.toUri().toString());
System.out.println(xq3);
final XQuery q = new XQuery(new SirixCompileChain(store), xq3);
q.execute(ctx);
}
}
use of org.sirix.index.IndexDef in project sirix by sirixdb.
the class FindNameIndex 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 QNm qnm = (QNm) Cast.cast(sctx, (Atomic) args[1], Type.QNM, false);
final Optional<IndexDef> indexDef = controller.getIndexes().findNameIndex(qnm);
if (indexDef.isPresent())
return new Int32(indexDef.get().getID());
return new Int32(-1);
}
use of org.sirix.index.IndexDef 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();
}
}
};
}
};
}
use of org.sirix.index.IndexDef in project sirix by sirixdb.
the class CreateCASIndex method execute.
@Override
public Sequence execute(StaticContext sctx, QueryContext ctx, Sequence[] args) throws QueryException {
if (args.length != 2 && args.length != 3) {
throw new QueryException(new QNm("No valid arguments specified!"));
}
final DBNode doc = ((DBNode) args[0]);
final XdmNodeReadTrx rtx = doc.getTrx();
final IndexController controller = rtx.getResourceManager().getWtxIndexController(rtx.getRevisionNumber() - 1);
if (!(doc.getTrx() instanceof XdmNodeWriteTrx)) {
throw new QueryException(new QNm("Collection must be updatable!"));
}
if (controller == null) {
throw new QueryException(new QNm("Document not found: " + ((Str) args[1]).stringValue()));
}
Type type = null;
if (args.length > 1 && args[1] != null) {
final QNm name = new QNm(Namespaces.XS_NSURI, ((Str) args[1]).stringValue());
type = sctx.getTypes().resolveAtomicType(name);
}
final Set<Path<QNm>> paths = new HashSet<>();
if (args.length == 3 && args[2] != null) {
final Iter it = args[2].iterate();
Item next = it.next();
while (next != null) {
paths.add(Path.parse(((Str) next).stringValue()));
next = it.next();
}
}
final IndexDef idxDef = IndexDefs.createCASIdxDef(false, Optional.fromNullable(type), paths, controller.getIndexes().getNrOfIndexDefsWithType(IndexType.CAS));
try {
controller.createIndexes(ImmutableSet.of(idxDef), (XdmNodeWriteTrx) doc.getTrx());
} catch (final SirixIOException e) {
throw new QueryException(new QNm("I/O exception: " + e.getMessage()), e);
}
return idxDef.materialize();
}
Aggregations