Skip to content

Commit

Permalink
Merge pull request #779 from seadowg/filter-strategy
Browse files Browse the repository at this point in the history
Fix interaction between function and filter plugins
  • Loading branch information
seadowg committed Jul 15, 2024
2 parents 882d0f8 + 5aa051f commit be1508c
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 36 deletions.
16 changes: 15 additions & 1 deletion PLUGINS.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,18 @@ Inspect external instances (their ID and parsed XML) after parsing or provide cu
### API
- `ExternalInstanceParser#addFileInstanceParser`

The default `ExternalInstanceParser` can be overridden by creating an implementation of `ExternalInstanceParserFactory` and calling `XFormUtils.setExternalInstanceParserFactory` with it.
The default `ExternalInstanceParser` can be overridden by creating an implementation of `ExternalInstanceParserFactory` and calling `XFormUtils.setExternalInstanceParserFactory` with it.

## Function

Add custom functions that can be called from XPath.

### API
- `FormEntryController#addFunctionHandler`

## Predicate evaluation

Add custom strategies for filtering nodes for predicate expressions.

### API
- `FormEntryController#addFilterStrategy`
66 changes: 35 additions & 31 deletions src/main/java/org/javarosa/core/model/FormDef.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,6 @@

package org.javarosa.core.model;

import static java.util.Collections.emptyList;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Queue;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.javarosa.core.model.TriggerableDag.EventNotifierAccessor;
import org.javarosa.core.model.actions.ActionController;
import org.javarosa.core.model.actions.Actions;
Expand Down Expand Up @@ -85,6 +66,26 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Queue;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.Collections.emptyList;

/**
* Definition of a form. This has some meta data about the form definition and a
* collection of groups together with question branching or skipping rules.
Expand Down Expand Up @@ -162,10 +163,10 @@ public static IDataReference getAbsRef(IDataReference ref, TreeReference parentR

private TriggerableDag dagImpl;

private boolean predicateCaching = true;
private final FilterStrategy comparisonExpressionCacheFilterStrategy = new ComparisonExpressionCacheFilterStrategy();
private final FilterStrategy equalityExpressionIndexFilterStrategy = new EqualityExpressionIndexFilterStrategy();
private final Queue<FilterStrategy> customFilterStrategies = new LinkedList<>();
private final List<IFunctionHandler> customFunctionHandlers = new ArrayList<>();

private QuestionPreloader preloader = new QuestionPreloader();

Expand Down Expand Up @@ -829,13 +830,15 @@ public boolean realTime() {
evaluationContext.addFunctionHandler(new ChoiceNameFunctionHandler(this) );
}

if (predicateCaching) {
List<FilterStrategy> filters = Stream.concat(
customFilterStrategies.stream(),
Stream.of(equalityExpressionIndexFilterStrategy, comparisonExpressionCacheFilterStrategy)
).collect(Collectors.toList());
List<FilterStrategy> filters = Stream.concat(
customFilterStrategies.stream(),
Stream.of(equalityExpressionIndexFilterStrategy, comparisonExpressionCacheFilterStrategy)
).collect(Collectors.toList());

evaluationContext = new EvaluationContext(evaluationContext, filters);

evaluationContext = new EvaluationContext(evaluationContext, filters);
for (IFunctionHandler functionHandler : customFunctionHandlers) {
evaluationContext.addFunctionHandler(functionHandler);
}
}

Expand Down Expand Up @@ -1626,13 +1629,14 @@ public Extras<Externalizable> getExtras() {
return extras;
}

public void disablePredicateCaching() {
predicateCaching = false;
dagImpl.disablePredicateCaching();
}

public void addFilterStrategy(FilterStrategy filterStrategy) {
customFilterStrategies.add(filterStrategy);
resetEvaluationContext();
}

public void addFunctionHandler(IFunctionHandler functionHandler) {
customFunctionHandlers.add(functionHandler);
resetEvaluationContext();
}

private void resetEvaluationContext() {
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/org/javarosa/form/api/FormEntryController.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.javarosa.core.model.IFormElement;
import org.javarosa.core.model.QuestionDef;
import org.javarosa.core.model.condition.FilterStrategy;
import org.javarosa.core.model.condition.IFunctionHandler;
import org.javarosa.core.model.data.IAnswerData;
import org.javarosa.core.model.instance.InvalidReferenceException;
import org.javarosa.core.model.instance.TreeElement;
Expand Down Expand Up @@ -347,11 +348,11 @@ private static FormIndex getRepeatGroupIndex(FormIndex index, FormDef formDef) {
}
}

public void disablePredicateCaching() {
model.getForm().disablePredicateCaching();
}

public void addFilterStrategy(FilterStrategy filterStrategy) {
model.getForm().addFilterStrategy(filterStrategy);
}

public void addFunctionHandler(IFunctionHandler functionHandler) {
model.getForm().addFunctionHandler(functionHandler);
}
}

0 comments on commit be1508c

Please sign in to comment.