Skip to content

Commit

Permalink
'#39 returns cachedBitSet map from CombinedFilterer to its previous
Browse files Browse the repository at this point in the history
structure Map<IFilter, FutureBitSetResult>, as the remove of an item in
this cache now only occurs when no other FilterNode refers to the same
filter.
  • Loading branch information
patrickdalla committed Jul 1, 2024
1 parent 5e52bfc commit 76eebde
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@
import iped.viewers.api.IResultSetFilterer;

public class CombinedFilterer implements IResultSetFilterer, IFilterChangeListener {
OperandNode rootNode = new OperandNode(Operand.OR);
OperandNode rootNode;

private final Map<FilterNode, FutureBitSetResult> cachedBitSet = new HashMap<>();
private final Map<IFilter, FutureBitSetResult> cachedBitSet = new HashMap<IFilter, FutureBitSetResult>();

int queueCount = 0;

Expand All @@ -62,8 +62,8 @@ public IMultiSearchResult filterResult(IMultiSearchResult src) throws ParseExcep
};
}

public void removePreCachedFilter(FilterNode node) {
cachedBitSet.remove(node);
public void removePreCachedFilter(IFilter filter) {
cachedBitSet.remove(filter);
}

/**
Expand Down Expand Up @@ -164,17 +164,23 @@ public RoaringBitmap[] get() throws InterruptedException, ExecutionException {
public RoaringBitmap[] get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
return null;
}

}

public void preCacheFilter(FilterNode node) {
IFilter filter = node.getFilter();
cachedBitSet.put(node, new FutureBitSetResult(this, filter));
public void preCacheFilter(IFilter filter, FutureBitSetResult fbs) {
cachedBitSet.put(filter, fbs);
if (filter instanceof IMutableFilter) {
((IMutableFilter) filter).addFilterChangeListener(this);
}
}

public void preCacheFilter(IFilter filter) {
preCacheFilter(filter, new FutureBitSetResult(this, filter));
}

public void preCacheFilterClone(IFilter filter, IFilter filterClonedSrc) {
preCacheFilter(filter, cachedBitSet.get(filterClonedSrc));
}

static public RoaringBitmap getAllSetBitSet(int length) {
RoaringBitmap bs = new RoaringBitmap();
bs.flip(0l, length);
Expand Down Expand Up @@ -289,6 +295,8 @@ public CombinedBitSet(MultiSearchResult input, OperandNode op) {
public void run() {
try {
result = getBitSet(input, op, self);
} catch (Exception e) {
e.printStackTrace();
} finally {
resultFinished.release();
}
Expand Down Expand Up @@ -371,16 +379,18 @@ public RoaringBitmap[] getBitSet(MultiSearchResult input, OperandNode op, Future
}
}

for (DecisionNode node : op.getChildren()) {
for (Iterator iterator = op.getChildren().iterator(); iterator.hasNext();) {
if (cancelCheck != null && cancelCheck.isCancelled()) {
return null;
}

DecisionNode node = (DecisionNode) iterator.next();

RoaringBitmap[] fbitset = null;
if (node instanceof FilterNode) {
try {
fbitset = cachedBitSet.get(((FilterNode) node)).get();
} catch (InterruptedException | ExecutionException e) {
fbitset = cachedBitSet.get(((FilterNode) node).getFilter()).get();
} catch (Exception e) {
e.printStackTrace();
}
} else if (node instanceof OperandNode) {
Expand Down Expand Up @@ -532,8 +542,8 @@ public boolean hasFiltersApplied() {
return false;
}

public void invertPreCached(FilterNode node) {
FutureBitSetResult fbitset = cachedBitSet.get(node);
public void invertPreCached(IFilter op) {
FutureBitSetResult fbitset = cachedBitSet.get(op);
fbitset.invert();
}

Expand All @@ -552,4 +562,8 @@ public void invalidateCache() {
cbs = null;
}

public void setRootNode(OperandNode rootNode) {
this.rootNode = rootNode;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
import javax.swing.JTree;

import iped.app.ui.App;
import iped.app.ui.CombinedFilterTreeModel;
import iped.app.ui.FiltererMenu;
import iped.app.ui.Messages;
import iped.app.ui.SliderMenuItem;
import iped.app.ui.filterdecisiontree.OperandNode.Operand;
import iped.data.IItemId;
import iped.viewers.api.IFilter;
import iped.viewers.api.IItemRef;
import iped.viewers.api.IQuantifiableFilter;

Expand Down Expand Up @@ -94,15 +96,18 @@ public void actionPerformed(ActionEvent e) {
}
}
if (e.getSource() == removeMenuitem) {
((DecisionNode) op).getParent().remove(op);
((DecisionNode) op).getParent().remove(op);
if (op instanceof FilterNode) {
logicFilterer.removePreCachedFilter((FilterNode) op);
if (!((CombinedFilterTreeModel) filtersTree.getModel())
.hasFilter((IFilter) ((FilterNode) op).getFilter())) {
logicFilterer.removePreCachedFilter((IFilter) ((FilterNode) op).getFilter());
}
}
}
if (e.getSource() == inverMenuitem) {
((DecisionNode) op).invert();
if (op instanceof FilterNode) {
logicFilterer.invertPreCached((FilterNode) op);
logicFilterer.invertPreCached(((FilterNode) op).getFilter());
}
logicFilterer.invalidateCache();
}
Expand Down Expand Up @@ -161,8 +166,8 @@ public void enableRemove() {
@Override
public void setVisible(boolean b) {
if (!b && sliderMenuItem.hasSliderChanged()) {
logicFilterer.removePreCachedFilter((FilterNode) op);
logicFilterer.preCacheFilter((FilterNode) op);
logicFilterer.removePreCachedFilter((IFilter) ((FilterNode) op).getFilter());
logicFilterer.preCacheFilter((IFilter) ((FilterNode) op).getFilter());

logicFilterer.startSearchResult(App.get().getResults());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import javax.swing.tree.TreePath;

import iped.app.ui.App;
import iped.app.ui.CombinedFilterTreeModel;
import iped.app.ui.FiltersPanel;
import iped.app.ui.Messages;
import iped.app.ui.filterdecisiontree.CombinedFilterer;
Expand Down Expand Up @@ -119,7 +120,7 @@ public void exportAsDrag(JComponent comp, InputEvent e, int action) {

@Override
public int getSourceActions(JComponent c) {
return MOVE;
return COPY_OR_MOVE;
}

@Override
Expand Down Expand Up @@ -173,28 +174,41 @@ public boolean importData(TransferSupport support) {
}
if (dest != null) {
FilterNode filterNode = (FilterNode) data.getTransferData(filterNodeFlavor);
IFilter filter = null;
IFilter filterClonedSrc = null;
if (filterNode != null) {
if (support.getDropAction() == COPY) {
filterNode = new FilterNode(filterNode.getFilter());
filterClonedSrc = filter;
filter = (IFilter) clone(((FilterNode) filterNode).getFilter());
if (filter != null) {
dest.addFilter(new FilterNode(filter, (CombinedFilterTreeModel) tree.getModel()));
} else {
return false;
}
} else {
if (support.getDropAction() == MOVE) {
dest.addFilter(filterNode);
tree.expandPath(destPath.pathByAddingChild(filterNode));
}
filterNode = null;
}
} else {
IFilter filter = (IFilter) data.getTransferData(filterFlavor);
filter = (IFilter) data.getTransferData(filterFlavor);
if (filter != null) {
filterNode = new FilterNode(filter);
FilterNode fn = new FilterNode(filter, (CombinedFilterTreeModel) tree.getModel());
dest.addFilter(fn);
tree.expandPath(destPath.pathByAddingChild(fn));
}
}
if (filterNode != null && filterNode.getFilter() != null) {
dest.addFilter(filterNode);
tree.expandPath(destPath.pathByAddingChild(filterNode));
if (filter != null) {
tree.updateUI();
try {
combinedFilterer.preCacheFilter(filterNode);
if (filterClonedSrc == null) {
combinedFilterer.preCacheFilter(filter);
} else {
if (filter != filterClonedSrc) {
combinedFilterer.preCacheFilterClone(filter, filterClonedSrc);
}
}
} catch (Exception e) {
if (e.getCause() instanceof QueryNodeException) {
JOptionPane.showMessageDialog(tree.getRootPane(), Messages.get("FiltersPanel.addQueryFilterError"));
Expand All @@ -206,7 +220,7 @@ public boolean importData(TransferSupport support) {
OperandNode operand = (OperandNode) data.getTransferData(operandNodeFlavor);
if (operand != null) {
if (support.getDropAction() == COPY) {
DecisionNode dn = operand.clone();
DecisionNode dn = (DecisionNode) clone(operand);
if (dn != null) {
dest.addDecisionNode(dn);
} else {
Expand All @@ -228,4 +242,8 @@ public boolean importData(TransferSupport support) {

}

private Object clone(Object object) {
return object;
}

}

0 comments on commit 76eebde

Please sign in to comment.