Interface GroupByColumnSelectorStrategy
-
- All Superinterfaces:
ColumnSelectorStrategy
- All Known Implementing Classes:
ArrayDoubleGroupByColumnSelectorStrategy
,ArrayLongGroupByColumnSelectorStrategy
,ArrayNumericGroupByColumnSelectorStrategy
,ArrayStringGroupByColumnSelectorStrategy
,DictionaryBuildingStringGroupByColumnSelectorStrategy
,DoubleGroupByColumnSelectorStrategy
,FloatGroupByColumnSelectorStrategy
,LongGroupByColumnSelectorStrategy
,NullableNumericGroupByColumnSelectorStrategy
,StringGroupByColumnSelectorStrategy
public interface GroupByColumnSelectorStrategy extends ColumnSelectorStrategy
Contains a collection of query processing methods for type-specific operations used exclusively by GroupByQueryEngineV2. Each GroupByColumnSelectorStrategy is associated with a single dimension. Strategies may have internal state, such as the dictionary maintained byDictionaryBuildingStringGroupByColumnSelectorStrategy
. Callers should assume that the internal state footprint starts out empty (zero bytes) and is also reset to zero on each call toreset()
. Each call toinitColumnValues(org.apache.druid.segment.ColumnValueSelector, int, java.lang.Object[])
orwriteToKeyBuffer(int, ColumnValueSelector, ByteBuffer)
returns the incremental increase in internal state footprint that happened as a result of that particular call.- See Also:
the vectorized version
-
-
Field Summary
Fields Modifier and Type Field Description static int
GROUP_BY_MISSING_VALUE
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description Grouper.BufferComparator
bufferComparator(int keyBufferPosition, StringComparator stringComparator)
Return BufferComparator for values written using this strategy when limit is pushed down to segment scan.boolean
checkRowIndexAndAddValueToGroupingKey(int keyBufferPosition, Object rowObj, int rowValIdx, ByteBuffer keyBuffer)
If rowValIdx is less than the size of rowObj (haven't handled all of the row values): First, read the value at rowValIdx from a rowObj and write that value to the keyBuffer at keyBufferPosition.int
getGroupingKeySize()
Return the size, in bytes, of this dimension's values in the grouping key.int
initColumnValues(ColumnValueSelector selector, int columnIndex, Object[] valuess)
Retrieve a row object from theColumnValueSelector
and put it in valuess at columnIndex.void
initGroupingKeyColumnValue(int keyBufferPosition, int dimensionIndex, Object rowObj, ByteBuffer keyBuffer, int[] stack)
Read the first value within a row values object (e.void
processValueFromGroupingKey(GroupByColumnSelectorPlus selectorPlus, ByteBuffer key, ResultRow resultRow, int keyBufferPosition)
Read a value from a grouping key and add it to the group by query result row, using the output name specified in a DimensionSpec.void
reset()
Reset any internal state held by this selector.int
writeToKeyBuffer(int keyBufferPosition, ColumnValueSelector selector, ByteBuffer keyBuffer)
Write a single object from the given selector to the keyBuffer at keyBufferPosition.
-
-
-
Field Detail
-
GROUP_BY_MISSING_VALUE
static final int GROUP_BY_MISSING_VALUE
- See Also:
- Constant Field Values
-
-
Method Detail
-
getGroupingKeySize
int getGroupingKeySize()
Return the size, in bytes, of this dimension's values in the grouping key. For example, a String implementation would return 4, the size of an int.- Returns:
- size, in bytes, of this dimension's values in the grouping key.
-
processValueFromGroupingKey
void processValueFromGroupingKey(GroupByColumnSelectorPlus selectorPlus, ByteBuffer key, ResultRow resultRow, int keyBufferPosition)
Read a value from a grouping key and add it to the group by query result row, using the output name specified in a DimensionSpec. An implementation may choose to not add anything to the result row (e.g., as the String implementation does for empty rows) selectorPlus provides access to: - the keyBufferPosition offset from which to read the value - the dimension value selector - the DimensionSpec for this dimension from the query- Parameters:
selectorPlus
- dimension info containing the key offset, value selector, and dimension specresultRow
- result row for the group by query being servedkey
- grouping keykeyBufferPosition
- buffer position for the grouping key, added to support chaining multipleColumnSelectorStrategy
-
initColumnValues
int initColumnValues(ColumnValueSelector selector, int columnIndex, Object[] valuess)
Retrieve a row object from theColumnValueSelector
and put it in valuess at columnIndex.- Parameters:
selector
- Value selector for a column.columnIndex
- Index of the column within the row values arrayvaluess
- Row values array, one index per column- Returns:
- estimated increase in internal state footprint, in bytes, as a result of this operation. May be zero if memory did not increase as a result of this operation. Will not be negative.
-
initGroupingKeyColumnValue
void initGroupingKeyColumnValue(int keyBufferPosition, int dimensionIndex, Object rowObj, ByteBuffer keyBuffer, int[] stack)
Read the first value within a row values object (e. g.IndexedInts
, as the value in a dictionary-encoded string column) and write that value to the keyBuffer at keyBufferPosition. If the row size is 0 (e. g.IndexedInts.size()
), writeGROUP_BY_MISSING_VALUE
instead. If the size of the row is > 0, write 1 to stack[] at columnIndex, otherwise write 0.- Parameters:
keyBufferPosition
- Starting offset for this column's value within the grouping key.dimensionIndex
- Index of this dimension within thestack
arrayrowObj
- Row value object for this columnkeyBuffer
- grouping keystack
- array containing the current within-row value index for each column
-
checkRowIndexAndAddValueToGroupingKey
boolean checkRowIndexAndAddValueToGroupingKey(int keyBufferPosition, Object rowObj, int rowValIdx, ByteBuffer keyBuffer)
If rowValIdx is less than the size of rowObj (haven't handled all of the row values): First, read the value at rowValIdx from a rowObj and write that value to the keyBuffer at keyBufferPosition. Then return true Otherwise, return false.- Parameters:
keyBufferPosition
- Starting offset for this column's value within the grouping key.rowObj
- Row value object for this column (e.g., IndexedInts)rowValIdx
- Index of the current value being grouped on within the rowkeyBuffer
- grouping key- Returns:
- true if rowValIdx < size of rowObj, false otherwise
-
writeToKeyBuffer
int writeToKeyBuffer(int keyBufferPosition, ColumnValueSelector selector, ByteBuffer keyBuffer)
Write a single object from the given selector to the keyBuffer at keyBufferPosition. The reading column must have a single value. The position of the keyBuffer may be modified.- Parameters:
keyBufferPosition
- starting offset for this column's value within the grouping keyselector
- selector to retrieve row value object fromkeyBuffer
- grouping key- Returns:
- estimated increase in internal state footprint, in bytes, as a result of this operation. May be zero if memory did not increase as a result of this operation. Will not be negative.
-
bufferComparator
Grouper.BufferComparator bufferComparator(int keyBufferPosition, @Nullable StringComparator stringComparator)
Return BufferComparator for values written using this strategy when limit is pushed down to segment scan.- Parameters:
keyBufferPosition
- starting offset for this column's value within the grouping keystringComparator
- stringComparator from LimitSpec for this column. If this is null, implementations will use theStringComparators.LEXICOGRAPHIC
comparator.- Returns:
- BufferComparator for comparing values written
-
reset
void reset()
Reset any internal state held by this selector. After this method is called, any row objects or key objects generated by any methods of this class must be considered unreadable. CallingprocessValueFromGroupingKey(org.apache.druid.query.groupby.epinephelinae.column.GroupByColumnSelectorPlus, java.nio.ByteBuffer, org.apache.druid.query.groupby.ResultRow, int)
on that memory has undefined behavior.
-
-