in query/binder.hpp [102:264]
int bindGeneric(InputIterators... boundInputIterators) {
InputVectorBinderBase<Context, NumVectors, NumUnboundIterators - 1>
nextBinder(context, inputVectors, indexVector, baseCounts, startCount);
InputVector input = inputVectors[NumVectors - NumUnboundIterators];
#define BIND_CONSTANT_INPUT(defaultValue, isValid) \
return nextBinder.bind( \
boundInputIterators..., \
make_constant_iterator( \
defaultValue, isValid));
if (input.Type == ConstantInput) {
ConstantVector constant = input.Vector.Constant;
if (constant.DataType == ConstInt) {
BIND_CONSTANT_INPUT(constant.Value.IntVal, constant.IsValid)
} else if (constant.DataType == ConstFloat) {
BIND_CONSTANT_INPUT(constant.Value.FloatVal, constant.IsValid)
}
} else if (input.Type == ScratchSpaceInput) {
ScratchSpaceVector scratchSpace = input.Vector.ScratchSpace;
uint32_t nullsOffset = scratchSpace.NullsOffset;
#define BIND_SCRATCH_SPACE_INPUT(dataType) \
return nextBinder.bind( \
boundInputIterators..., \
make_scratch_space_input_iterator<dataType>( \
scratchSpace.Values, \
nullsOffset));
switch (scratchSpace.DataType) {
case Int32:
BIND_SCRATCH_SPACE_INPUT(int32_t)
case Uint32:
BIND_SCRATCH_SPACE_INPUT(uint32_t)
case Float32:
BIND_SCRATCH_SPACE_INPUT(float_t)
case UUID:
BIND_SCRATCH_SPACE_INPUT(UUIDT)
case GeoPoint:
BIND_SCRATCH_SPACE_INPUT(GeoPointT)
default:
throw std::invalid_argument(
"Unsupported data type for ScratchSpaceInput");
}
} else if (input.Type == ForeignColumnInput) {
// Note: for now foreign vectors are dimension table columns
// that are not compressed nor pre sliced
RecordID *recordIDs = input.Vector.ForeignVP.RecordIDs;
const int32_t numBatches = input.Vector.ForeignVP.NumBatches;
const int32_t baseBatchID = input.Vector.ForeignVP.BaseBatchID;
VectorPartySlice *vpSlices = input.Vector.ForeignVP.Batches;
const int32_t numRecordsInLastBatch =
input.Vector.ForeignVP.NumRecordsInLastBatch;
int16_t *const timezoneLookup = input.Vector.ForeignVP.TimezoneLookup;
int16_t timezoneLookupSize = input.Vector.ForeignVP.TimezoneLookupSize;
DataType dataType = input.Vector.ForeignVP.DataType;
bool hasDefault = input.Vector.ForeignVP.DefaultValue.HasDefault;
DefaultValue defaultValueStruct = input.Vector.ForeignVP.DefaultValue;
uint8_t stepInBytes = getStepInBytes(dataType);
switch (dataType) {
#define BIND_FOREIGN_COLUMN_INPUT(defaultValue, dataType) \
ForeignTableIterator<dataType> *vpIters = \
prepareForeignTableIterators(numBatches, vpSlices, stepInBytes, \
hasDefault, defaultValue, context.getStream()); \
int res = nextBinder.bind(boundInputIterators..., \
RecordIDJoinIterator<dataType>( \
recordIDs, numBatches, baseBatchID, \
vpIters, numRecordsInLastBatch, \
timezoneLookup, timezoneLookupSize)); \
deviceFree(vpIters); \
return res;
case Bool: {
BIND_FOREIGN_COLUMN_INPUT(defaultValueStruct.Value.BoolVal, bool)
}
case Int8:
case Int16:
case Int32: {
BIND_FOREIGN_COLUMN_INPUT(
defaultValueStruct.Value.Int32Val, int32_t)
}
case Uint8:
case Uint16:
case Uint32: {
BIND_FOREIGN_COLUMN_INPUT(
defaultValueStruct.Value.Uint32Val, uint32_t)
}
case Float32: {
BIND_FOREIGN_COLUMN_INPUT(
defaultValueStruct.Value.FloatVal, float_t)
}
default:
throw std::invalid_argument(
"Unsupported data type for VectorPartyInput: " +
std::to_string(__LINE__));
}
}
VectorPartySlice inputVP = input.Vector.VP;
bool hasDefault = inputVP.DefaultValue.HasDefault;
bool isConstant = inputVP.BasePtr == nullptr;
DefaultValue defaultValue = inputVP.DefaultValue;
if (isConstant) {
switch (inputVP.DataType) {
case Bool:
BIND_CONSTANT_INPUT(defaultValue.Value.BoolVal, hasDefault)
case Int8:
case Int16:
case Int32:
BIND_CONSTANT_INPUT(defaultValue.Value.Int32Val, hasDefault)
case Uint8:
case Uint16:
case Uint32:
BIND_CONSTANT_INPUT(defaultValue.Value.Uint32Val, hasDefault)
case Float32:
BIND_CONSTANT_INPUT(defaultValue.Value.FloatVal, hasDefault)
default:
throw std::invalid_argument(
"Unsupported data type for VectorPartyInput: " +
std::to_string(__LINE__));
}
}
// Non constant.
uint8_t *basePtr = inputVP.BasePtr;
uint32_t nullsOffset = inputVP.NullsOffset;
uint32_t valuesOffset = inputVP.ValuesOffset;
uint8_t startingIndex = inputVP.StartingIndex;
uint8_t stepInBytes = getStepInBytes(inputVP.DataType);
uint32_t length = inputVP.Length;
switch (inputVP.DataType) {
#define BIND_COLUMN_INPUT(dataType) \
return nextBinder.bind(boundInputIterators..., \
make_column_iterator<dataType>(indexVector, \
baseCounts, \
startCount, \
basePtr, \
nullsOffset, \
valuesOffset, \
length, \
stepInBytes, \
startingIndex));
case Bool:
BIND_COLUMN_INPUT(bool)
case Int8:
case Int16:
case Int32:
BIND_COLUMN_INPUT(int32_t)
case Uint8:
case Uint16:
case Uint32:
BIND_COLUMN_INPUT(uint32_t)
case Float32:
BIND_COLUMN_INPUT(float_t)
default:
throw std::invalid_argument(
"Unsupported data type for VectorPartyInput: " +
std::to_string(__LINE__));
}
}