use of org.sirix.index.avltree.keyvalue.NodeReferences in project sirix by sirixdb.
the class CASIndexBuilder method process.
private VisitResult process(final ImmutableNode node) {
try {
if (node.getKind() == Kind.TEXT) {
mRtx.moveTo(node.getParentKey());
}
final long PCR = mRtx.isDocumentRoot() ? 0 : mRtx.getNameNode().getPathNodeKey();
if (mPaths.isEmpty() || mPathSummaryReader.getPCRsForPaths(mPaths).contains(PCR)) {
final Str strValue = new Str(((ImmutableValueNode) node).getValue());
boolean isOfType = false;
try {
if (mType != Type.STR)
AtomicUtil.toType(strValue, mType);
isOfType = true;
} catch (final SirixRuntimeException e) {
}
if (isOfType) {
final CASValue value = new CASValue(strValue, mType, PCR);
final Optional<NodeReferences> textReferences = mAVLTreeWriter.get(value, SearchMode.EQUAL);
if (textReferences.isPresent()) {
setNodeReferences(node, textReferences.get(), value);
} else {
setNodeReferences(node, new NodeReferences(), value);
}
}
}
mRtx.moveTo(node.getNodeKey());
} catch (final PathException | SirixIOException e) {
LOGGER.error(e.getMessage(), e);
}
return VisitResultType.CONTINUE;
}
use of org.sirix.index.avltree.keyvalue.NodeReferences in project sirix by sirixdb.
the class CASIndexImpl method openIndex.
@Override
public Iterator<NodeReferences> openIndex(PageReadTrx pageReadTrx, IndexDef indexDef, CASFilter filter) {
final AVLTreeReader<CASValue, NodeReferences> reader = AVLTreeReader.getInstance(pageReadTrx, indexDef.getType(), indexDef.getID());
// PCRs requested.
final Set<Long> pcrsRequested = filter.getPCRs();
// PCRs available in index.
final Set<Long> pcrsAvailable = filter.getPCRCollector().getPCRsForPaths(indexDef.getPaths()).getPCRs();
// CASValue.
if (pcrsAvailable.size() <= 1 && pcrsRequested.size() == 1) {
final Atomic atomic = filter.getKey();
final long pcr = pcrsRequested.iterator().next();
final SearchMode mode = filter.getMode();
final CASValue value = new CASValue(atomic, atomic.type(), pcr);
if (mode == SearchMode.EQUAL) {
// Compare for equality by PCR and atomic value.
final Optional<AVLNode<CASValue, NodeReferences>> node = reader.getAVLNode(value, mode);
if (node.isPresent()) {
return Iterators.forArray(node.get().getValue());
}
return Collections.emptyIterator();
} else {
// Compare for search criteria by PCR and atomic value.
final Optional<AVLNode<CASValue, NodeReferences>> node = reader.getAVLNode(value, mode);
if (node.isPresent()) {
// Iterate over subtree.
final Iterator<AVLNode<CASValue, NodeReferences>> iter = reader.new AVLNodeIterator(node.get().getNodeKey());
return Iterators.concat(Iterators.forArray(node.get().getValue()), new IndexFilterAxis<CASValue>(iter, ImmutableSet.of(filter)));
}
return Collections.emptyIterator();
}
} else if (pcrsRequested.size() == 1) {
final Atomic atomic = filter.getKey();
final long pcr = pcrsRequested.iterator().next();
final SearchMode mode = filter.getMode();
final CASValue value = new CASValue(atomic, atomic.type(), pcr);
if (mode == SearchMode.EQUAL) {
// Compare for equality by PCR and atomic value.
final Optional<AVLNode<CASValue, NodeReferences>> node = reader.getAVLNode(value, mode);
if (node.isPresent()) {
// Iterate over subtree.
final Iterator<AVLNode<CASValue, NodeReferences>> iter = reader.new AVLNodeIterator(node.get().getNodeKey());
return Iterators.concat(Iterators.forArray(node.get().getValue()), new IndexFilterAxis<CASValue>(iter, ImmutableSet.of(filter)));
}
return Collections.emptyIterator();
} else {
// Compare for equality only by PCR.
final Optional<AVLNode<CASValue, NodeReferences>> node = reader.getAVLNode(value, SearchMode.EQUAL, (CASValue v1, CASValue v2) -> ((Long) v1.getPathNodeKey()).compareTo(v2.getPathNodeKey()));
if (node.isPresent()) {
// Now compare for equality by PCR and atomic value and find first
// node which satisfies criteria.
final Optional<AVLNode<CASValue, NodeReferences>> firstFoundNode = reader.getAVLNode(node.get().getNodeKey(), value, mode);
if (firstFoundNode.isPresent()) {
// Iterate over subtree.
final Iterator<AVLNode<CASValue, NodeReferences>> iter = reader.new AVLNodeIterator(firstFoundNode.get().getNodeKey());
return Iterators.concat(Iterators.forArray(firstFoundNode.get().getValue()), new IndexFilterAxis<CASValue>(iter, ImmutableSet.of(filter)));
} else {
return Iterators.forArray(firstFoundNode.get().getValue());
}
}
return Collections.emptyIterator();
}
} else {
final Iterator<AVLNode<CASValue, NodeReferences>> iter = reader.new AVLNodeIterator(Fixed.DOCUMENT_NODE_KEY.getStandardProperty());
return new IndexFilterAxis<CASValue>(iter, ImmutableSet.of(filter));
}
}
use of org.sirix.index.avltree.keyvalue.NodeReferences in project sirix by sirixdb.
the class CASIndexListener method insert.
private void insert(final ValueNode node, final long pathNodeKey) throws SirixIOException {
final Str strValue = new Str(node.getValue());
boolean isOfType = false;
try {
AtomicUtil.toType(strValue, mType);
isOfType = true;
} catch (final SirixRuntimeException e) {
}
if (isOfType) {
final CASValue indexValue = new CASValue(strValue, mType, pathNodeKey);
final Optional<NodeReferences> textReferences = mAVLTreeWriter.get(indexValue, SearchMode.EQUAL);
if (textReferences.isPresent()) {
setNodeReferences(node, textReferences.get(), indexValue);
} else {
setNodeReferences(node, new NodeReferences(), indexValue);
}
}
}
use of org.sirix.index.avltree.keyvalue.NodeReferences in project sirix by sirixdb.
the class NameIndexBuilder method visit.
@Override
public VisitResult visit(final ImmutableElement node) {
final QNm name = node.getName();
final boolean included = (mIncludes.isEmpty() || mIncludes.contains(name));
final boolean excluded = (!mExcludes.isEmpty() && mExcludes.contains(name));
if (!included || excluded) {
return VisitResultType.CONTINUE;
}
final Optional<NodeReferences> textReferences = mAVLTreeWriter.get(name, SearchMode.EQUAL);
try {
if (textReferences.isPresent()) {
setNodeReferences(node, textReferences.get(), name);
} else {
setNodeReferences(node, new NodeReferences(), name);
}
} catch (final SirixIOException e) {
LOGGER.error(e.getMessage(), e);
}
return VisitResultType.CONTINUE;
}
use of org.sirix.index.avltree.keyvalue.NodeReferences in project sirix by sirixdb.
the class NameIndexListener method listen.
@Override
public void listen(ChangeType type, @Nonnull ImmutableNode node, long pathNodeKey) throws SirixIOException {
if (node instanceof NameNode) {
final NameNode nameNode = (NameNode) node;
final QNm name = nameNode.getName();
final boolean included = (mIncludes.isEmpty() || mIncludes.contains(name));
final boolean excluded = (!mExcludes.isEmpty() && mExcludes.contains(name));
if (!included || excluded) {
return;
}
switch(type) {
case INSERT:
final Optional<NodeReferences> textReferences = mAVLTreeWriter.get(name, SearchMode.EQUAL);
if (textReferences.isPresent()) {
setNodeReferences(node, textReferences.get(), name);
} else {
setNodeReferences(node, new NodeReferences(), name);
}
break;
case DELETE:
mAVLTreeWriter.remove(name, node.getNodeKey());
break;
default:
}
}
}
Aggregations