Cumulus4j API
(1.0.0)

org.cumulus4j.store.query.eval
Class NotExpressionEvaluator

java.lang.Object
  extended by org.cumulus4j.store.query.eval.AbstractExpressionEvaluator<DyadicExpression>
      extended by org.cumulus4j.store.query.eval.NotExpressionEvaluator

public class NotExpressionEvaluator
extends AbstractExpressionEvaluator<DyadicExpression>

Evaluator handling "!" (negation).

It is quite expensive to evaluate a negation (JDOQL "!") by first querying the normal (non-negated) result and then negating it by querying ALL candidates and finally filtering the normal result out. Therefore, we instead push the negation down the expression-evaluator-tree into the leafs. Thus NotExpressionEvaluator simply calls ResultDescriptor.negate() and passes the negated ResultDescriptor down the evaluator-tree. All nodes in the tree therefore have to take this negation-flag into account.

Example 1: Instead of querying the expensive expression "!( a > 5 && b <= 12 )", the cheaper equivalent "a <= 5 || b > 12" is used.

Example 2: Instead of "!( !( a > 5 && b <= 12 ) || c > 3 )" the equivalent "( a <= 5 || b > 12 ) && c <= 3" is executed.

See De Morgan's laws in wikipedia for details.

Author:
Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de

Constructor Summary
NotExpressionEvaluator(QueryEvaluator queryEvaluator, AbstractExpressionEvaluator<?> parent, DyadicExpression expression)
           
 
Method Summary
protected  Set<Long> _queryResultDataEntryIDs(ResultDescriptor resultDescriptor)
          Execute a query for the given resultDescriptor.
 
Methods inherited from class org.cumulus4j.store.query.eval.AbstractExpressionEvaluator
_getResultSymbols, _queryResultObjects, getExpression, getFieldType, getLeft, getParent, getQueryEvaluator, getResultSymbols, getRight, queryResultDataEntryIDs, queryResultObjects, setLeft, setRight
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

NotExpressionEvaluator

public NotExpressionEvaluator(QueryEvaluator queryEvaluator,
                              AbstractExpressionEvaluator<?> parent,
                              DyadicExpression expression)
Method Detail

_queryResultDataEntryIDs

protected Set<Long> _queryResultDataEntryIDs(ResultDescriptor resultDescriptor)
Description copied from class: AbstractExpressionEvaluator
Execute a query for the given resultDescriptor. This method should contain the concrete logic for AbstractExpressionEvaluator.queryResultDataEntryIDs(ResultDescriptor) and must be implemented by subclasses.

Specified by:
_queryResultDataEntryIDs in class AbstractExpressionEvaluator<DyadicExpression>
Parameters:
resultDescriptor - the descriptor specifying what candidates (usually "this" or a variable) the caller is interested in as well as modifiers (e.g. negation) affecting the query.
Returns:
those dataEntryIDs that match the query criteria for the specified resultSymbol or null, if the symbol is not supported (this should be consistent with the implementation of AbstractExpressionEvaluator._getResultSymbols()).
See Also:
AbstractExpressionEvaluator.queryResultDataEntryIDs(ResultDescriptor)

Cumulus4j API
(1.0.0)

Copyright © 2012 NightLabs Consulting GmbH. All Rights Reserved.