[Fix] Refactored Search API to auto cast

This commit is contained in:
Robert von Burg 2018-10-25 11:22:26 +02:00
parent d7f090ed9e
commit c64fdf81d7
8 changed files with 118 additions and 99 deletions

View File

@ -8,7 +8,7 @@ import li.strolch.utils.collections.DateRange;
*
* @param <T>
*/
public interface ExpressionBuilder<T extends StrolchRootElement> {
public interface ExpressionBuilder {
Object extract(StrolchRootElement element);
@ -16,59 +16,59 @@ public interface ExpressionBuilder<T extends StrolchRootElement> {
return e -> e;
}
default SearchExpression<T> isEqualTo(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> isEqualTo(Object right) {
return element -> PredicatesSupport.isEqualTo(right).matches(extract(element));
}
default SearchExpression<T> isNotEqualTo(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> isNotEqualTo(Object right) {
return element -> PredicatesSupport.isNotEqualTo(right).matches(extract(element));
}
default SearchExpression<T> isEqualToIgnoreCase(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> isEqualToIgnoreCase(Object right) {
return element -> PredicatesSupport.isEqualToIgnoreCase(right).matches(extract(element));
}
default SearchExpression<T> isNotEqualToIgnoreCase(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> isNotEqualToIgnoreCase(Object right) {
return element -> PredicatesSupport.isNotEqualToIgnoreCase(right).matches(extract(element));
}
default SearchExpression<T> startsWith(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> startsWith(Object right) {
return element -> PredicatesSupport.startsWith(right).matches(extract(element));
}
default SearchExpression<T> startsWithIgnoreCase(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> startsWithIgnoreCase(Object right) {
return element -> PredicatesSupport.startsWithIgnoreCase(right).matches(extract(element));
}
default SearchExpression<T> endsWith(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> endsWith(Object right) {
return element -> PredicatesSupport.endsWith(right).matches(extract(element));
}
default SearchExpression<T> endsWithIgnoreCase(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> endsWithIgnoreCase(Object right) {
return element -> PredicatesSupport.endsWithIgnoreCase(right).matches(extract(element));
}
default SearchExpression<T> contains(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> contains(Object right) {
return element -> PredicatesSupport.contains(right).matches(extract(element));
}
default SearchExpression<T> listContains(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> listContains(Object right) {
return element -> PredicatesSupport.listContains(right).matches(extract(element));
}
default SearchExpression<T> containsIgnoreCase(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> containsIgnoreCase(Object right) {
return element -> PredicatesSupport.containsIgnoreCase(right).matches(extract(element));
}
default SearchExpression<T> isIn(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> isIn(Object right) {
return element -> PredicatesSupport.isIn(right).matches(extract(element));
}
default SearchExpression<T> isInIgnoreCase(Object right) {
default <T extends StrolchRootElement> SearchExpression<T> isInIgnoreCase(Object right) {
return element -> PredicatesSupport.isInIgnoreCase(right).matches(extract(element));
}
default SearchExpression<T> inRange(DateRange range) {
default <T extends StrolchRootElement> SearchExpression<T> inRange(DateRange range) {
return element -> PredicatesSupport.inRange(range).matches(extract(element));
}
}

View File

@ -18,7 +18,7 @@ public class ExpressionsSupport {
return element -> predicate.matches(element.getId());
}
public static <T extends StrolchRootElement> ExpressionBuilder<T> id() {
public static ExpressionBuilder id() {
return StrolchElement::getId;
}
@ -26,17 +26,17 @@ public class ExpressionsSupport {
return element -> predicate.matches(element.getName());
}
public static <T extends StrolchRootElement> ExpressionBuilder<T> name() {
public static <T extends StrolchRootElement> ExpressionBuilder name() {
return StrolchElement::getName;
}
public static <T extends StrolchRootElement> SearchExpression<T> date(SearchPredicate predicate) {
ExpressionBuilder<StrolchRootElement> eb = date();
ExpressionBuilder eb = date();
return element -> predicate.coerce(eb.getValueCoercer(element)).matches(eb);
}
public static <T extends StrolchRootElement> ExpressionBuilder<T> date() {
return new ExpressionBuilder<T>() {
public static <T extends StrolchRootElement> ExpressionBuilder date() {
return new ExpressionBuilder() {
@Override
public ValueCoercer getValueCoercer(StrolchRootElement context) {
@ -55,12 +55,12 @@ public class ExpressionsSupport {
}
public static <T extends StrolchRootElement> SearchExpression<T> state(SearchPredicate predicate) {
ExpressionBuilder<StrolchRootElement> eb = state();
ExpressionBuilder eb = state();
return element -> predicate.coerce(eb.getValueCoercer(element)).matches(eb.extract(element));
}
public static <T extends StrolchRootElement> ExpressionBuilder<T> state() {
return new ExpressionBuilder<T>() {
public static ExpressionBuilder state() {
return new ExpressionBuilder() {
@Override
public ValueCoercer getValueCoercer(StrolchRootElement context) {
@ -84,12 +84,12 @@ public class ExpressionsSupport {
public static <T extends StrolchRootElement> SearchExpression<T> param(String bagId, String paramId,
SearchPredicate predicate) {
ExpressionBuilder<StrolchRootElement> eb = param(bagId, paramId);
ExpressionBuilder eb = param(bagId, paramId);
return element -> predicate.coerce(eb.getValueCoercer(element)).matches(eb.extract(element));
}
public static <T extends StrolchRootElement> ExpressionBuilder<T> param(String bagId, String paramId) {
return new ExpressionBuilder<T>() {
public static <T extends StrolchRootElement> ExpressionBuilder param(String bagId, String paramId) {
return new ExpressionBuilder() {
@Override
public ValueCoercer getValueCoercer(StrolchRootElement context) {

View File

@ -1,14 +1,9 @@
package li.strolch.search;
import li.strolch.model.Order;
import li.strolch.model.Resource;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.activity.Activity;
/**
* Defines a search expression interface to perform where clauses on {@link StrolchRootElement}
*
* @param <T>
*/
@FunctionalInterface
public interface SearchExpression<T extends StrolchRootElement> {
@ -31,8 +26,9 @@ public interface SearchExpression<T extends StrolchRootElement> {
*
* @return the new search expression with an internal OR of the two search expressions
*/
default SearchExpression<T> or(SearchExpression<T> right) {
return element -> this.matches(element) || right.matches(element);
@SuppressWarnings("unchecked")
default <U extends StrolchRootElement> SearchExpression<U> or(SearchExpression<T> right) {
return element -> this.matches((T) element) || right.matches((T) element);
}
/**
@ -43,8 +39,9 @@ public interface SearchExpression<T extends StrolchRootElement> {
*
* @return the new search expression with an internal AND of the two search expressions
*/
default SearchExpression<T> and(SearchExpression<T> right) {
return element -> this.matches(element) && right.matches(element);
@SuppressWarnings("unchecked")
default <U extends StrolchRootElement> SearchExpression<U> and(SearchExpression<T> right) {
return element -> this.matches((T) element) && right.matches((T) element);
}
/**
@ -52,40 +49,8 @@ public interface SearchExpression<T extends StrolchRootElement> {
*
* @return a new search expression where this search expression is negated
*/
default SearchExpression<T> not() {
return element -> !this.matches(element);
}
/**
* Map this search expression to a {@link Resource} search expression
*
* @return a new search expression for Resource elements
*/
default SearchExpression<Resource> asResource() {
@SuppressWarnings("unchecked")
SearchExpression<Resource> exp = element -> this.matches((T) element);
return exp;
}
/**
* Map this search expression to a {@link Order} search expression
*
* @return a new search expression for Order elements
*/
default SearchExpression<Order> asOrder() {
@SuppressWarnings("unchecked")
SearchExpression<Order> exp = element -> this.matches((T) element);
return exp;
}
/**
* Map this search expression to a {@link Activity} search expression
*
* @return a new search expression for Activity elements
*/
default SearchExpression<Activity> asActivity() {
@SuppressWarnings("unchecked")
SearchExpression<Activity> exp = element -> this.matches((T) element);
return exp;
@SuppressWarnings("unchecked")
default <U extends StrolchRootElement> SearchExpression<U> not() {
return element -> !this.matches((T) element);
}
}

View File

@ -7,53 +7,54 @@ import li.strolch.model.StrolchRootElement;
*
* @param <T>
*/
public interface SearchExpressions<T extends StrolchRootElement> {
public interface SearchExpressions {
default SearchExpression<T> not(SearchExpression<T> expression) {
default <T extends StrolchRootElement> SearchExpression<T> not(SearchExpression<T> expression) {
return element -> !expression.matches(element);
}
default ExpressionBuilder<T> id() {
default ExpressionBuilder id() {
return ExpressionsSupport.id();
}
default SearchExpression<T> id(SearchPredicate predicate) {
default <T extends StrolchRootElement> SearchExpression<T> id(SearchPredicate predicate) {
return ExpressionsSupport.id(predicate);
}
default ExpressionBuilder<T> name() {
default ExpressionBuilder name() {
return ExpressionsSupport.name();
}
default SearchExpression<T> name(SearchPredicate predicate) {
default <T extends StrolchRootElement> SearchExpression<T> name(SearchPredicate predicate) {
return ExpressionsSupport.name(predicate);
}
default ExpressionBuilder<T> date() {
default ExpressionBuilder date() {
return ExpressionsSupport.date();
}
default SearchExpression<T> date(SearchPredicate predicate) {
default <T extends StrolchRootElement> SearchExpression<T> date(SearchPredicate predicate) {
return ExpressionsSupport.date(predicate);
}
default ExpressionBuilder<T> state() {
default ExpressionBuilder state() {
return ExpressionsSupport.state();
}
default SearchExpression<T> state(SearchPredicate predicate) {
default <T extends StrolchRootElement> SearchExpression<T> state(SearchPredicate predicate) {
return ExpressionsSupport.state(predicate);
}
default ExpressionBuilder<T> param(String bagId, String paramId) {
default ExpressionBuilder param(String bagId, String paramId) {
return ExpressionsSupport.param(bagId, paramId);
}
default SearchExpression<T> param(String bagId, String paramId, SearchPredicate predicate) {
default <T extends StrolchRootElement> SearchExpression<T> param(String bagId, String paramId,
SearchPredicate predicate) {
return ExpressionsSupport.param(bagId, paramId, predicate);
}
default SearchExpression<T> paramNull(String bagId, String paramId) {
default <T extends StrolchRootElement> SearchExpression<T> paramNull(String bagId, String paramId) {
return ExpressionsSupport.paramNull(bagId, paramId);
}
}

View File

@ -19,7 +19,7 @@ import li.strolch.utils.helper.ExceptionHelper;
* @param <T>
*/
public abstract class StrolchSearch<T extends StrolchRootElement>
implements SearchExpressions<T>, SearchPredicates, Restrictable {
implements SearchExpressions, SearchPredicates, Restrictable {
private String privilegeValue;

View File

@ -276,7 +276,7 @@ public class StrolchSearchTest {
Map<String, State> states = new ActivitySearch()
.types().where(state().isEqualTo(State.PLANNING).and(name(isEqualTo("Activity"))).asActivity())
.types().where(state().isEqualTo(State.PLANNING).and(name(isEqualTo("Activity"))))
.search(tx).toMap(Activity::getId, Activity::getState);

View File

@ -87,6 +87,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return the found {@link Parameter} or null if it was not found
*/
@Override
public <U, T extends Parameter<U>> T getParameter(String bagKey, String paramKey) {
return getParameter(bagKey, paramKey, false);
}
@ -105,8 +106,9 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
* @return the found {@link Parameter} or null if it was not found
*
* @throws StrolchModelException
* if the element does not exist and <code>assertExists</code> is true
* if the element does not exist and {@code assertExists} is true
*/
@Override
public <U, T extends Parameter<U>> T getParameter(String bagKey, String paramKey, boolean assertExists)
throws StrolchModelException {
if (this.parameterBagMap == null) {
@ -147,6 +149,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return the parameters with the given interpretation
*/
@Override
public List<Parameter<?>> getParametersByInterpretation(String bagKey, String interpretation) {
ParameterBag bag = getParameterBag(bagKey);
if (bag == null)
@ -167,6 +170,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return the parameters with the given interpretation
*/
@Override
public List<Parameter<?>> getParametersByInterpretationAndUom(String bagKey, String interpretation, String uom) {
ParameterBag bag = getParameterBag(bagKey);
if (bag == null)
@ -186,6 +190,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
* @throws StrolchException
* if the {@link ParameterBag} does not exist
*/
@Override
public void addParameter(String bagKey, Parameter<?> parameter) throws StrolchException {
assertNotReadonly();
if (this.parameterBagMap == null) {
@ -211,6 +216,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return the removed {@link Parameter} or null if it did not exist
*/
@Override
public <U, T extends Parameter<U>> T removeParameter(String bagKey, String paramKey) {
assertNotReadonly();
if (this.parameterBagMap == null) {
@ -232,6 +238,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return the {@link ParameterBag} with the given key, or null if it does not exist
*/
@Override
public ParameterBag getParameterBag(String key) {
return getParameterBag(key, false);
}
@ -246,6 +253,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return the {@link ParameterBag} with the given key, or null if it does not exist
*/
@Override
public ParameterBag getParameterBag(String key, boolean assertExists) {
if (this.parameterBagMap == null) {
if (assertExists) {
@ -272,6 +280,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return the {@link ParameterBag ParameterBags} of the given type
*/
@Override
public List<ParameterBag> getParameterBagsByType(String type) {
return this.parameterBagMap.values() //
.stream() //
@ -285,6 +294,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
* @param bag
* the {@link ParameterBag} to add
*/
@Override
public void addParameterBag(ParameterBag bag) {
assertNotReadonly();
if (this.parameterBagMap == null) {
@ -307,6 +317,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return the removed {@link ParameterBag}, or null if it does not exist
*/
@Override
public ParameterBag removeParameterBag(String key) {
assertNotReadonly();
if (this.parameterBagMap == null) {
@ -320,6 +331,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return true if this {@link GroupedParameterizedElement} has any {@link ParameterBag ParameterBag}
*/
@Override
public boolean hasParameterBags() {
return this.parameterBagMap != null && !this.parameterBagMap.isEmpty();
}
@ -332,6 +344,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return true if the {@link ParameterBag} with the given key exists on this {@link GroupedParameterizedElement}.
*/
@Override
public boolean hasParameterBag(String bagKey) {
return this.parameterBagMap != null && this.parameterBagMap.containsKey(bagKey);
}
@ -349,6 +362,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
* bagKey. False is returned if the {@link ParameterBag} does not exist, or the {@link Parameter} does not exist on
* the {@link ParameterBag}
*/
@Override
public boolean hasParameter(String bagKey, String paramKey) {
if (this.parameterBagMap == null) {
return false;
@ -366,6 +380,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
*
* @return the {@link Set} of keys for the {@link ParameterBag}s on this {@link GroupedParameterizedElement}
*/
@Override
public Set<String> getParameterBagKeySet() {
if (this.parameterBagMap == null) {
return Collections.emptySet();
@ -377,6 +392,7 @@ public abstract class GroupedParameterizedElement extends AbstractStrolchElement
* Fills {@link GroupedParameterizedElement} properties of this clone
*
* @param clone
* the clone to fill
*/
protected void fillClone(GroupedParameterizedElement clone) {
super.fillClone(clone);

View File

@ -1,5 +1,6 @@
package li.strolch.model;
import java.util.List;
import java.util.Set;
import li.strolch.exception.StrolchException;
@ -25,7 +26,7 @@ public interface ParameterBagContainer extends StrolchElement {
*
* @return the found {@link Parameter} or null if it was not found
*/
public <U, T extends Parameter<U>> T getParameter(String bagKey, String paramKey);
<U, T extends Parameter<U>> T getParameter(String bagKey, String paramKey);
/**
* Returns the {@link Parameter} with the given key from the {@link ParameterBag} with the given bagKey, or null if
@ -40,7 +41,33 @@ public interface ParameterBagContainer extends StrolchElement {
*
* @return the found {@link Parameter} or null if it was not found
*/
public <U, T extends Parameter<U>> T getParameter(String bagKey, String paramKey, boolean assertExists);
<U, T extends Parameter<U>> T getParameter(String bagKey, String paramKey, boolean assertExists);
/**
* Returns a list of all the {@link Parameter Parameters} with the given interpretation
*
* @param bagKey
* the key of the {@link ParameterBag} from which the {@link Parameter} is to be returned
* @param interpretation
* the interpretation for which the parameters are to be returned
*
* @return the parameters with the given interpretation
*/
List<Parameter<?>> getParametersByInterpretation(String bagKey, String interpretation);
/**
* Returns a list of all the {@link Parameter Parameters} with the given interpretation
*
* @param bagKey
* the key of the {@link ParameterBag} from which the {@link Parameter} is to be returned
* @param interpretation
* the interpretation for which the parameters are to be returned
* @param uom
* the uom for which the parameters are to be returned
*
* @return the parameters with the given interpretation
*/
List<Parameter<?>> getParametersByInterpretationAndUom(String bagKey, String interpretation, String uom);
/**
* Adds a new {@link Parameter} to the {@link ParameterBag} with the given key
@ -53,7 +80,7 @@ public interface ParameterBagContainer extends StrolchElement {
* @throws StrolchException
* if the {@link ParameterBag} does not exist
*/
public void addParameter(String bagKey, Parameter<?> parameter) throws StrolchException;
void addParameter(String bagKey, Parameter<?> parameter) throws StrolchException;
/**
* Removes the {@link Parameter} with the given paramKey from the {@link ParameterBag} with the given bagKey
@ -65,7 +92,7 @@ public interface ParameterBagContainer extends StrolchElement {
*
* @return the removed {@link Parameter} or null if it did not exist
*/
public <U, T extends Parameter<U>> T removeParameter(String bagKey, String paramKey);
<U, T extends Parameter<U>> T removeParameter(String bagKey, String paramKey);
/**
* Returns the {@link ParameterBag} with the given key, or null if it does not exist
@ -75,7 +102,7 @@ public interface ParameterBagContainer extends StrolchElement {
*
* @return the {@link ParameterBag} with the given key, or null if it does not exist
*/
public ParameterBag getParameterBag(String key);
ParameterBag getParameterBag(String key);
/**
* Returns the {@link ParameterBag} with the given key, or null if it does not exist
@ -87,7 +114,17 @@ public interface ParameterBagContainer extends StrolchElement {
*
* @return the {@link ParameterBag} with the given key, or null if it does not exist
*/
public ParameterBag getParameterBag(String key, boolean assertExists);
ParameterBag getParameterBag(String key, boolean assertExists);
/**
* Returns the {@link ParameterBag ParameterBags} of the given type
*
* @param type
* the type of {@link ParameterBag} to return
*
* @return the {@link ParameterBag ParameterBags} of the given type
*/
List<ParameterBag> getParameterBagsByType(String type);
/**
* Adds the given {@link ParameterBag} to this {@link GroupedParameterizedElement}
@ -95,7 +132,7 @@ public interface ParameterBagContainer extends StrolchElement {
* @param bag
* the {@link ParameterBag} to add
*/
public void addParameterBag(ParameterBag bag);
void addParameterBag(ParameterBag bag);
/**
* Removes the {@link ParameterBag} with the given key
@ -105,14 +142,14 @@ public interface ParameterBagContainer extends StrolchElement {
*
* @return the removed {@link ParameterBag}, or null if it does not exist
*/
public ParameterBag removeParameterBag(String key);
ParameterBag removeParameterBag(String key);
/**
* Returns true if this {@link GroupedParameterizedElement} has any {@link ParameterBag ParameterBag}
*
* @return true if this {@link GroupedParameterizedElement} has any {@link ParameterBag ParameterBag}
*/
public boolean hasParameterBags();
boolean hasParameterBags();
/**
* Returns true if the {@link ParameterBag} with the given key exists on this {@link GroupedParameterizedElement}.
@ -122,7 +159,7 @@ public interface ParameterBagContainer extends StrolchElement {
*
* @return true if the {@link ParameterBag} with the given key exists on this {@link GroupedParameterizedElement}.
*/
public boolean hasParameterBag(String bagKey);
boolean hasParameterBag(String bagKey);
/**
* Returns true if the {@link Parameter} with the given paramKey exists on the {@link ParameterBag} with the given
@ -137,12 +174,12 @@ public interface ParameterBagContainer extends StrolchElement {
* bagKey. False is returned if the {@link ParameterBag} does not exist, or the {@link Parameter} does not exist on
* the {@link ParameterBag}
*/
public boolean hasParameter(String bagKey, String paramKey);
boolean hasParameter(String bagKey, String paramKey);
/**
* Returns the {@link Set} of keys for the {@link ParameterBag}s on this {@link GroupedParameterizedElement}
*
* @return the {@link Set} of keys for the {@link ParameterBag}s on this {@link GroupedParameterizedElement}
*/
public Set<String> getParameterBagKeySet();
Set<String> getParameterBagKeySet();
}