public class Operation extends RangeIterator<java.lang.Long,Token>
Modifier and Type | Class and Description |
---|---|
static class |
Operation.Builder |
static class |
Operation.OperationType |
AbstractIterator.State
Modifier and Type | Field and Description |
---|---|
protected com.google.common.collect.ListMultimap<ColumnDefinition,Expression> |
expressions |
protected Operation |
left |
protected Operation.OperationType |
op |
protected RangeIterator<java.lang.Long,Token> |
range |
protected Operation |
right |
next, state
Modifier and Type | Method and Description |
---|---|
protected static com.google.common.collect.ListMultimap<ColumnDefinition,Expression> |
analyzeGroup(QueryController controller,
Operation.OperationType op,
java.util.List<RowFilter.Expression> expressions) |
void |
close() |
protected Token |
computeNext()
Returns the next element.
|
protected void |
performSkipTo(java.lang.Long nextToken) |
boolean |
satisfiedBy(Unfiltered currentCluster,
Row staticRow,
boolean allowMissingColumns)
Recursive "satisfies" checks based on operation
and data from the lower level members using depth-first search
and bubbling the results back to the top level caller.
|
getCount, getCurrent, getMaximum, getMinimum, isOverlapping, isOverlapping, recomputeNext, skipTo, tryToComputeNext
endOfData, hasNext, next, peek, remove
protected final Operation.OperationType op
protected final com.google.common.collect.ListMultimap<ColumnDefinition,Expression> expressions
protected final RangeIterator<java.lang.Long,Token> range
protected Operation left
protected Operation right
public boolean satisfiedBy(Unfiltered currentCluster, Row staticRow, boolean allowMissingColumns)
localSatisfiedBy(Unfiltered, Row, boolean)
see it's comment for details, if there are no local expressions
assigned to Operation it will call satisfiedBy(Row) on it's children.
Query: first_name = X AND (last_name = Y OR address = XYZ AND street = IL AND city = C) OR (state = 'CA' AND country = 'US')
Row: key1: (first_name: X, last_name: Z, address: XYZ, street: IL, city: C, state: NY, country:US)
#1 OR
/ \
#2 (first_name) AND AND (state, country)
\
#3 (last_name) OR
\
#4 AND (address, street, city)
Evaluation of the key1 is top-down depth-first search:
--- going down ---
Level #1 is evaluated, OR expression has to pull results from it's children which are at level #2 and OR them together,
Level #2 AND (state, country) could be be evaluated right away, AND (first_name) refers to it's "right" child from level #3
Level #3 OR (last_name) requests results from level #4
Level #4 AND (address, street, city) does logical AND between it's 3 fields, returns result back to level #3.
--- bubbling up ---
Level #3 computes OR between AND (address, street, city) result and it's "last_name" expression
Level #2 computes AND between "first_name" and result of level #3, AND (state, country) which is already computed
Level #1 does OR between results of AND (first_name) and AND (state, country) and returns final result.currentCluster
- The row cluster to check.staticRow
- The static row associated with current cluster.allowMissingColumns
- allow columns value to be null.protected static com.google.common.collect.ListMultimap<ColumnDefinition,Expression> analyzeGroup(QueryController controller, Operation.OperationType op, java.util.List<RowFilter.Expression> expressions)
protected Token computeNext()
AbstractIterator
AbstractIterator.endOfData()
when there are no elements left in the iteration. Failure to
do so could result in an infinite loop.
The initial invocation of AbstractIterator.hasNext()
or AbstractIterator.next()
calls
this method, as does the first invocation of hasNext
or next
following each successful call to next
. Once the
implementation either invokes endOfData
or throws an exception,
computeNext
is guaranteed to never be called again.
If this method throws an exception, it will propagate outward to the
hasNext
or next
invocation that invoked this method. Any
further attempts to use the iterator will result in an IllegalStateException
.
The implementation of this method may not invoke the hasNext
,
next
, or AbstractIterator.peek()
methods on this instance; if it does, an
IllegalStateException
will result.
computeNext
in class AbstractIterator<Token>
endOfData
was called
during execution, the return value will be ignored.protected void performSkipTo(java.lang.Long nextToken)
performSkipTo
in class RangeIterator<java.lang.Long,Token>
public void close() throws java.io.IOException
java.io.IOException
Copyright © 2018 The Apache Software Foundation