Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.apache.pinot.core.operator.blocks.ValueBlock;
import org.apache.pinot.core.operator.transform.TransformResultMetadata;
import org.apache.pinot.segment.spi.index.reader.Dictionary;
import org.apache.pinot.spi.data.FieldSpec;
import org.roaringbitmap.RoaringBitmap;


Expand Down Expand Up @@ -171,4 +172,55 @@ default void init(List<TransformFunction> arguments, Map<String, ColumnContext>
*/
@Nullable
RoaringBitmap getNullBitmap(ValueBlock block);

/**
* Validates transform function configuration during table creation.
*/
default void validateIngestionConfig(String transformFunctionExpression, org.apache.pinot.spi.data.Schema schema) {
// Default: no validation
}

/**
* Returns whether this function supports ingestion-time transformation.
*/
default boolean supportsIngestionTransform() {
return true;
}

/**
* Infers output data type based on input arguments.
*/
default org.apache.pinot.spi.data.FieldSpec.DataType inferOutputDataType(List<String> inputArguments,
org.apache.pinot.spi.data.Schema schema) {
return FieldSpec.DataType.STRING;
}

/**
* Returns expected input data types for validation.
*/
default FieldSpec.DataType[] getExpectedInputDataTypes() {
return new org.apache.pinot.spi.data.FieldSpec.DataType[0];
}

/**
* Returns minimum number of arguments required.
*/
default int getMinArgumentCount() {
return 0;
}

/**
* Returns maximum number of arguments allowed (-1 for unlimited).
*/
default int getMaxArgumentCount() {
return -1;
}

/**
* Validates input data type compatibility.
*/
default boolean isInputDataTypeSupported(FieldSpec.DataType inputType,
int argumentIndex) {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ public void setSchemaConformingTransformerV2Config(
@JsonPropertyDescription("Configs related to check time value for segment")
private boolean _segmentTimeValueCheck = true;

@JsonPropertyDescription("Default validation mode for transform functions: STRICT, LENIENT, or LEGACY")
private TransformConfig.ValidationMode _defaultTransformValidationMode;

@Deprecated
public IngestionConfig(@Nullable BatchIngestionConfig batchIngestionConfig,
@Nullable StreamIngestionConfig streamIngestionConfig, @Nullable FilterConfig filterConfig,
Expand Down Expand Up @@ -200,4 +203,14 @@ public void setRowTimeValueCheck(boolean rowTimeValueCheck) {
public void setSegmentTimeValueCheck(boolean segmentTimeValueCheck) {
_segmentTimeValueCheck = segmentTimeValueCheck;
}

@Nullable
public TransformConfig.ValidationMode getDefaultTransformValidationMode() {
return _defaultTransformValidationMode;
}

public void setDefaultTransformValidationMode(
@Nullable TransformConfig.ValidationMode defaultTransformValidationMode) {
_defaultTransformValidationMode = defaultTransformValidationMode;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,33 @@
*/
public class TransformConfig extends BaseJsonConfig {

public enum ValidationMode {
STRICT, // No automatic type conversions allowed
LENIENT, // Allow safe type conversions (recommended)
LEGACY // Allow all existing conversions including STRING->numeric (default)
}

@JsonPropertyDescription("Column name")
private final String _columnName;

@JsonPropertyDescription("Transformation function string")
private final String _transformFunction;

@JsonPropertyDescription("Validation mode for type checking: STRICT, LENIENT, or LEGACY")
private final ValidationMode _validationMode;

@JsonCreator
public TransformConfig(@JsonProperty("columnName") String columnName,
@JsonProperty("transformFunction") String transformFunction) {
@JsonProperty("transformFunction") String transformFunction,
@JsonProperty("validationMode") ValidationMode validationMode) {
_columnName = columnName;
_transformFunction = transformFunction;
_validationMode = validationMode != null ? validationMode : ValidationMode.LEGACY;
}

// Backward compatibility constructor
public TransformConfig(String columnName, String transformFunction) {
this(columnName, transformFunction, ValidationMode.LEGACY);
}

public String getColumnName() {
Expand All @@ -49,4 +65,8 @@ public String getColumnName() {
public String getTransformFunction() {
return _transformFunction;
}

public ValidationMode getValidationMode() {
return _validationMode;
}
}
Loading