Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Node key reference sets/bitmaps should not be inlined… #645

Merged
merged 7 commits into from
Jul 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.sirix.cache.BufferManager;
import org.sirix.exception.SirixIOException;
import org.sirix.exception.SirixUsageException;
import org.sirix.io.DirectIOUtils;
import org.sirix.utils.LogWrapper;
import org.sirix.utils.SirixFiles;
import org.slf4j.LoggerFactory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import org.sirix.cache.*;
import org.sirix.index.name.Names;
import org.sirix.index.redblacktree.RBNode;
import org.sirix.node.interfaces.Node;
import org.sirix.page.PageReference;
import org.sirix.page.RevisionRootPage;
import org.sirix.page.interfaces.Page;
Expand All @@ -15,7 +15,7 @@ public final class EmptyBufferManager implements org.sirix.cache.BufferManager {

private static final EmptyCache<Integer, RevisionRootPage> REVISION_ROOT_PAGE_CACHE = new EmptyCache<>();

private static final EmptyCache<RBIndexKey, RBNode<?, ?>> AVL_NODE_CACHE = new EmptyCache<>();
private static final EmptyCache<RBIndexKey, Node> INDEX_CACHE = new EmptyCache<>();

private static final EmptyCache<NamesCacheKey, Names> NAMES_CACHE = new EmptyCache<>();

Expand All @@ -40,8 +40,8 @@ public Cache<Integer, RevisionRootPage> getRevisionRootPageCache() {
}

@Override
public Cache<RBIndexKey, RBNode<?, ?>> getIndexCache() {
return AVL_NODE_CACHE;
public Cache<RBIndexKey, Node> getIndexCache() {
return INDEX_CACHE;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import org.sirix.exception.SirixUsageException;
import org.sirix.index.IndexType;
import org.sirix.index.path.summary.PathSummaryReader;
import org.sirix.index.redblacktree.RBNode;
import org.sirix.io.IOStorage;
import org.sirix.io.Reader;
import org.sirix.io.Writer;
Expand Down Expand Up @@ -211,7 +210,7 @@ protected void initializeIndexController(final int revision, IndexController<?,
}

@Override
public Cache<RBIndexKey, RBNode<?, ?>> getIndexCache() {
public Cache<RBIndexKey, Node> getIndexCache() {
return bufferManager.getIndexCache();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,20 +64,14 @@ Set<JsonNodeVisitor> createIndexBuilders(final Set<IndexDef> indexDefs, final Js
final var indexBuilders = new HashSet<JsonNodeVisitor>(indexDefs.size());
for (final IndexDef indexDef : indexDefs) {
switch (indexDef.getType()) {
case PATH:
indexBuilders.add(createPathIndexBuilder(nodeWriteTrx.getPageWtx(), nodeWriteTrx.getPathSummary(), indexDef));
break;
case CAS:
indexBuilders.add(createCASIndexBuilder(nodeWriteTrx,
nodeWriteTrx.getPageWtx(),
nodeWriteTrx.getPathSummary(),
indexDef));
break;
case NAME:
indexBuilders.add(createNameIndexBuilder(nodeWriteTrx.getPageWtx(), indexDef));
break;
default:
break;
case PATH -> indexBuilders.add(createPathIndexBuilder(nodeWriteTrx.getPageWtx(),
nodeWriteTrx.getPathSummary(),
indexDef));
case CAS -> indexBuilders.add(createCASIndexBuilder(nodeWriteTrx,
nodeWriteTrx.getPageWtx(),
nodeWriteTrx.getPathSummary(),
indexDef));
case NAME -> indexBuilders.add(createNameIndexBuilder(nodeWriteTrx.getPageWtx(), indexDef));
}
}
return indexBuilders;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

package org.sirix.api;

import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.sirix.access.ResourceConfiguration;
import org.sirix.access.User;
import org.sirix.access.trx.node.AfterCommitState;
Expand All @@ -34,10 +36,8 @@
import org.sirix.exception.SirixThreadedException;
import org.sirix.exception.SirixUsageException;
import org.sirix.index.path.summary.PathSummaryReader;
import org.sirix.index.redblacktree.RBNode;
import org.sirix.node.interfaces.Node;

import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.nio.file.Path;
import java.time.Instant;
import java.util.List;
Expand Down Expand Up @@ -376,5 +376,5 @@ default PathSummaryReader openPathSummary() {
*
* @return the cache
*/
Cache<RBIndexKey, RBNode<?, ?>> getIndexCache();
Cache<RBIndexKey, Node> getIndexCache();
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.sirix.cache;

import org.sirix.index.name.Names;
import org.sirix.index.redblacktree.RBNode;
import org.sirix.node.interfaces.Node;
import org.sirix.page.PageReference;
import org.sirix.page.RevisionRootPage;
import org.sirix.page.interfaces.Page;
Expand All @@ -13,7 +13,7 @@ public interface BufferManager extends AutoCloseable {

Cache<Integer, RevisionRootPage> getRevisionRootPageCache();

Cache<RBIndexKey, RBNode<?, ?>> getIndexCache();
Cache<RBIndexKey, Node> getIndexCache();

Cache<NamesCacheKey, Names> getNamesCache();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.sirix.cache;

import org.sirix.index.redblacktree.RBNode;
import org.sirix.node.interfaces.Node;
import org.sirix.page.PageReference;
import org.sirix.page.RevisionRootPage;
import org.sirix.page.interfaces.Page;
Expand Down Expand Up @@ -44,7 +44,7 @@ public Cache<Integer, RevisionRootPage> getRevisionRootPageCache() {
}

@Override
public Cache<RBIndexKey, RBNode<?, ?>> getIndexCache() {
public Cache<RBIndexKey, Node> getIndexCache() {
return redBlackTreeNodeCache;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,30 @@
import com.github.benmanes.caffeine.cache.RemovalCause;
import com.github.benmanes.caffeine.cache.RemovalListener;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.sirix.index.redblacktree.RBNode;
import org.sirix.index.redblacktree.RBNodeKey;
import org.sirix.node.interfaces.Node;

import java.util.Map;

public final class RedBlackTreeNodeCache implements Cache<RBIndexKey, RBNode<?, ?>> {
public final class RedBlackTreeNodeCache implements Cache<RBIndexKey, Node> {

private final com.github.benmanes.caffeine.cache.Cache<RBIndexKey, RBNode<?, ?>> cache;
private final com.github.benmanes.caffeine.cache.Cache<RBIndexKey, Node> cache;

public RedBlackTreeNodeCache(final int maxSize) {
final RemovalListener<RBIndexKey, RBNode<?, ?>> removalListener =
(RBIndexKey key, RBNode<?, ?> value, RemovalCause cause) -> {
final RemovalListener<RBIndexKey, Node> removalListener =
(RBIndexKey key, Node value, RemovalCause cause) -> {
assert key != null;
assert value != null;
final RBNode<?, ?> parent = value.getParent();

if (parent != null) {
if (value.equals(parent.getLeftChild())) {
parent.setLeftChild(null);
} else if (value.equals(parent.getRightChild())) {
parent.setRightChild(null);
if (value instanceof RBNodeKey<?> rbNodeKey) {
final RBNodeKey<?> parent = rbNodeKey.getParent();

if (parent != null) {
if (value.equals(parent.getLeftChild())) {
parent.setLeftChild(null);
} else if (value.equals(parent.getRightChild())) {
parent.setRightChild(null);
}
}
}
};
Expand All @@ -37,17 +41,17 @@ public void clear() {
}

@Override
public RBNode<?, ?> get(RBIndexKey key) {
public Node get(RBIndexKey key) {
return cache.getIfPresent(key);
}

@Override
public void put(RBIndexKey key, @NonNull RBNode<?, ?> value) {
public void put(RBIndexKey key, @NonNull Node value) {
cache.put(key, value);
}

@Override
public void putAll(Map<? extends RBIndexKey, ? extends RBNode<?, ?>> map) {
public void putAll(Map<? extends RBIndexKey, ? extends Node> map) {
cache.putAll(map);
}

Expand All @@ -57,7 +61,7 @@ public void toSecondCache() {
}

@Override
public Map<RBIndexKey, RBNode<?, ?>> getAll(Iterable<? extends RBIndexKey> keys) {
public Map<RBIndexKey, Node> getAll(Iterable<? extends RBIndexKey> keys) {
return cache.getAllPresent(keys);
}

Expand Down
5 changes: 2 additions & 3 deletions bundles/sirix-core/src/main/java/org/sirix/index/Filter.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package org.sirix.index;

import org.sirix.index.redblacktree.RBNode;
import org.sirix.index.redblacktree.keyvalue.NodeReferences;
import org.sirix.index.redblacktree.RBNodeKey;

public interface Filter {

<K extends Comparable<? super K>> boolean filter(RBNode<K, NodeReferences> node);
<K extends Comparable<? super K>> boolean filter(RBNodeKey<K> node);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

import java.util.Iterator;
import java.util.Set;
import org.sirix.index.redblacktree.RBNode;
import org.sirix.index.redblacktree.RBNodeKey;
import org.sirix.index.redblacktree.RBTreeReader;
import org.sirix.index.redblacktree.keyvalue.NodeReferences;
import com.google.common.collect.AbstractIterator;

Expand All @@ -11,29 +12,35 @@
public final class IndexFilterAxis<K extends Comparable<? super K>>
extends AbstractIterator<NodeReferences> {

private final Iterator<RBNode<K, NodeReferences>> iter;
private final RBTreeReader<K, NodeReferences> treeReader;

private final Iterator<RBNodeKey<K>> iter;

private final Set<? extends Filter> filter;

public IndexFilterAxis(final Iterator<RBNode<K, NodeReferences>> iter,

public IndexFilterAxis(final RBTreeReader<K, NodeReferences> treeReader, final Iterator<RBNodeKey<K>> iter,
final Set<? extends Filter> filter) {
this.treeReader = requireNonNull(treeReader);
this.iter = requireNonNull(iter);
this.filter = requireNonNull(filter);
}

@Override
protected NodeReferences computeNext() {
while (iter.hasNext()) {
final RBNode<K, NodeReferences> node = iter.next();
final RBNodeKey<K> node = iter.next();
boolean filterResult = true;
for (final Filter filter : filter) {
filterResult = filterResult && filter.filter(node);
filterResult = filter.filter(node);
if (!filterResult) {
break;
}
}
if (filterResult) {
return node.getValue();
treeReader.moveTo(node.getValueNodeKey());
assert treeReader.getCurrentNodeAsRBNodeValue() != null;
return treeReader.getCurrentNodeAsRBNodeValue().getValue();
}
}
return endOfData();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ public interface Materializable {
* Materialize the object as a {@link Node} tree
*
* @return the root of the materialized tree
* @throws DocumentException
* @throws DocumentException if materialization fails
*/
public Node<?> materialize() throws DocumentException;
Node<?> materialize();

/**
* Initializes the materialized locator facet
*
* @param root root of the materialized facet subtree
* @throws DocumentException
* @throws DocumentException if initialization fails
*/
public void init(Node<?> root) throws DocumentException;
void init(Node<?> root);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,10 @@
import org.brackit.xquery.util.path.Path;
import org.sirix.index.Filter;
import org.sirix.index.SearchMode;
import org.sirix.index.redblacktree.RBNode;
import org.sirix.index.redblacktree.keyvalue.CASValue;
import org.sirix.index.redblacktree.keyvalue.NodeReferences;
import org.sirix.index.path.PCRCollector;
import org.sirix.index.path.PathFilter;
import org.sirix.index.redblacktree.RBNodeKey;
import org.sirix.index.redblacktree.keyvalue.CASValue;

import java.util.Set;

Expand All @@ -23,9 +22,6 @@
*/
public final class CASFilter implements Filter {

/** The paths to filter. */
private final Set<Path<QNm>> paths;

/** {@link PathFilter} instance to filter specific paths. */
private final PathFilter pathFilter;

Expand All @@ -45,8 +41,7 @@ public final class CASFilter implements Filter {
*/
public CASFilter(final Set<Path<QNm>> paths, final Atomic key, final SearchMode mode,
final PCRCollector pcrCollector) {
this.paths = requireNonNull(paths);
pathFilter = new PathFilter(this.paths, pcrCollector);
this.pathFilter = new PathFilter(requireNonNull(paths), pcrCollector);
this.key = key;
this.mode = requireNonNull(mode);
}
Expand Down Expand Up @@ -74,7 +69,7 @@ public Atomic getKey() {
* @return {@code true} if the node has been filtered, {@code false} otherwise
*/
@Override
public <K extends Comparable<? super K>> boolean filter(final RBNode<K, NodeReferences> node) {
public <K extends Comparable<? super K>> boolean filter(final RBNodeKey<K> node) {
final K key = node.getKey();
if (key instanceof final CASValue casValue) {
return pathFilter.filter(node) && (this.key == null || mode.compare(this.key, casValue.getAtomicValue()) == 0);
Expand Down
Loading
Loading