@Test public void testComputeDefaultColumnActionMapForCommittedSegment() { Schema schema0 = new Schema.SchemaBuilder().setSchemaName("testTable").addSingleValueDimension("column1", FieldSpec.DataType.INT) .addSingleValueDimension("column2", FieldSpec.DataType.INT) .addSingleValueDimension("column3", FieldSpec.DataType.STRING) .addSingleValueDimension("column4", FieldSpec.DataType.STRING) .addSingleValueDimension("column5", FieldSpec.DataType.STRING) .addSingleValueDimension("column6", FieldSpec.DataType.INT) .addSingleValueDimension("column7", FieldSpec.DataType.INT) .addSingleValueDimension("column8", FieldSpec.DataType.INT) .addSingleValueDimension("column9", FieldSpec.DataType.INT) .addSingleValueDimension("column10", FieldSpec.DataType.INT) .addSingleValueDimension("column13", FieldSpec.DataType.INT) .addSingleValueDimension("count", FieldSpec.DataType.INT) .addSingleValueDimension("daysSinceEpoch", FieldSpec.DataType.INT) .addSingleValueDimension("weeksSinceEpochSunday", FieldSpec.DataType.INT).build(); BaseDefaultColumnHandler defaultColumnHandler = new V3DefaultColumnHandler(segmentDirectory, schema0, committedSegmentMetadata, writer); Assert.assertEquals(defaultColumnHandler.computeDefaultColumnActionMap(), Collections.EMPTY_MAP); Schema schema1 = new Schema.SchemaBuilder().setSchemaName("testTable").addSingleValueDimension("column1", FieldSpec.DataType.INT) .addSingleValueDimension("column2", FieldSpec.DataType.INT) .addSingleValueDimension("column3", FieldSpec.DataType.STRING) .addSingleValueDimension("column4", FieldSpec.DataType.STRING) .addSingleValueDimension("column5", FieldSpec.DataType.STRING) .addSingleValueDimension("column6", FieldSpec.DataType.INT) .addSingleValueDimension("column7", FieldSpec.DataType.INT) .addSingleValueDimension("column8", FieldSpec.DataType.INT) .addSingleValueDimension("column9", FieldSpec.DataType.INT) .addSingleValueDimension("column10", FieldSpec.DataType.INT) .addSingleValueDimension("column11", FieldSpec.DataType.INT) .addSingleValueDimension("column13", FieldSpec.DataType.INT) .addSingleValueDimension("count", FieldSpec.DataType.INT) .addSingleValueDimension("daysSinceEpoch", FieldSpec.DataType.INT) .addSingleValueDimension("weeksSinceEpochSunday", FieldSpec.DataType.INT).build(); defaultColumnHandler = new V3DefaultColumnHandler(segmentDirectory, schema1, committedSegmentMetadata, writer); Assert.assertEquals(defaultColumnHandler.computeDefaultColumnActionMap(), ImmutableMap.of("column11", DefaultColumnAction.ADD_DIMENSION)); Schema schema2 = new Schema.SchemaBuilder().setSchemaName("testTable").addSingleValueDimension("column1", FieldSpec.DataType.INT) .addSingleValueDimension("column2", FieldSpec.DataType.INT) .addSingleValueDimension("column3", FieldSpec.DataType.STRING) .addSingleValueDimension("column4", FieldSpec.DataType.STRING) .addSingleValueDimension("column5", FieldSpec.DataType.STRING) .addSingleValueDimension("column6", FieldSpec.DataType.INT) .addSingleValueDimension("column7", FieldSpec.DataType.INT) .addSingleValueDimension("column8", FieldSpec.DataType.INT) .addSingleValueDimension("column9", FieldSpec.DataType.INT) .addSingleValueDimension("column10", FieldSpec.DataType.INT) .addMultiValueDimension("column11", FieldSpec.DataType.INT) .addSingleValueDimension("column13", FieldSpec.DataType.INT) .addSingleValueDimension("count", FieldSpec.DataType.INT) .addSingleValueDimension("daysSinceEpoch", FieldSpec.DataType.INT) .addSingleValueDimension("weeksSinceEpochSunday", FieldSpec.DataType.INT).build(); defaultColumnHandler = new V3DefaultColumnHandler(segmentDirectory, schema2, committedSegmentMetadata, writer); Assert.assertEquals(defaultColumnHandler.computeDefaultColumnActionMap(), ImmutableMap.of("column11", DefaultColumnAction.ADD_DIMENSION)); Schema schema3 = new Schema.SchemaBuilder().setSchemaName("testTable").addSingleValueDimension("column1", FieldSpec.DataType.INT) .addSingleValueDimension("column2", FieldSpec.DataType.INT) .addSingleValueDimension("column3", FieldSpec.DataType.STRING) .addSingleValueDimension("column4", FieldSpec.DataType.STRING) .addSingleValueDimension("column5", FieldSpec.DataType.STRING) .addSingleValueDimension("column6", FieldSpec.DataType.INT) .addSingleValueDimension("column7", FieldSpec.DataType.INT) .addSingleValueDimension("column8", FieldSpec.DataType.INT) .addSingleValueDimension("column9", FieldSpec.DataType.INT) .addSingleValueDimension("column10", FieldSpec.DataType.INT) .addSingleValueDimension("column13", FieldSpec.DataType.INT) .addSingleValueDimension("count", FieldSpec.DataType.INT) .addSingleValueDimension("daysSinceEpoch", FieldSpec.DataType.INT) .addSingleValueDimension("weeksSinceEpochSunday", FieldSpec.DataType.INT) .addMetric("column11", FieldSpec.DataType.INT).build(); defaultColumnHandler = new V3DefaultColumnHandler(segmentDirectory, schema3, committedSegmentMetadata, writer); Assert.assertEquals(defaultColumnHandler.computeDefaultColumnActionMap(), ImmutableMap.of("column11", DefaultColumnAction.ADD_METRIC)); Schema schema4= new Schema.SchemaBuilder().setSchemaName("testTable").addSingleValueDimension("column1", FieldSpec.DataType.INT) .addSingleValueDimension("column2", FieldSpec.DataType.INT) .addSingleValueDimension("column3", FieldSpec.DataType.STRING) .addSingleValueDimension("column4", FieldSpec.DataType.STRING) .addSingleValueDimension("column5", FieldSpec.DataType.STRING) .addSingleValueDimension("column6", FieldSpec.DataType.INT) .addSingleValueDimension("column7", FieldSpec.DataType.INT) .addSingleValueDimension("column8", FieldSpec.DataType.INT) .addSingleValueDimension("column9", FieldSpec.DataType.INT) .addSingleValueDimension("column10", FieldSpec.DataType.INT) .addSingleValueDimension("column13", FieldSpec.DataType.INT) .addSingleValueDimension("count", FieldSpec.DataType.INT) .addSingleValueDimension("daysSinceEpoch", FieldSpec.DataType.INT) .addSingleValueDimension("weeksSinceEpochSunday", FieldSpec.DataType.INT) .addDateTime("column11", FieldSpec.DataType.INT, "1:HOURS:EPOCH", "1:HOURS").build(); defaultColumnHandler = new V3DefaultColumnHandler(segmentDirectory, schema4, committedSegmentMetadata, writer); Assert.assertEquals(defaultColumnHandler.computeDefaultColumnActionMap(), ImmutableMap.of("column11", DefaultColumnAction.ADD_DATE_TIME)); Schema schema5 = new Schema.SchemaBuilder().setSchemaName("testTable").addSingleValueDimension("column1", FieldSpec.DataType.INT) .addSingleValueDimension("column3", FieldSpec.DataType.STRING) .addSingleValueDimension("column4", FieldSpec.DataType.STRING) .addSingleValueDimension("column5", FieldSpec.DataType.STRING) .addSingleValueDimension("column6", FieldSpec.DataType.INT) .addSingleValueDimension("column7", FieldSpec.DataType.INT) .addSingleValueDimension("column8", FieldSpec.DataType.INT) .addSingleValueDimension("column9", FieldSpec.DataType.INT) .addSingleValueDimension("column10", FieldSpec.DataType.INT) .addSingleValueDimension("column13", FieldSpec.DataType.INT) .addSingleValueDimension("count", FieldSpec.DataType.INT) .addSingleValueDimension("daysSinceEpoch", FieldSpec.DataType.INT) .addSingleValueDimension("weeksSinceEpochSunday", FieldSpec.DataType.INT).build(); defaultColumnHandler = new V3DefaultColumnHandler(segmentDirectory, schema5, committedSegmentMetadata, writer); Assert.assertEquals(defaultColumnHandler.computeDefaultColumnActionMap(), Collections.EMPTY_MAP); Schema schema6 = new Schema.SchemaBuilder().setSchemaName("testTable").addSingleValueDimension("column1", FieldSpec.DataType.INT) .addSingleValueDimension("column2", FieldSpec.DataType.STRING) .addSingleValueDimension("column3", FieldSpec.DataType.STRING) .addSingleValueDimension("column4", FieldSpec.DataType.STRING) .addSingleValueDimension("column5", FieldSpec.DataType.STRING) .addSingleValueDimension("column6", FieldSpec.DataType.INT) .addSingleValueDimension("column7", FieldSpec.DataType.INT) .addSingleValueDimension("column8", FieldSpec.DataType.INT) .addSingleValueDimension("column9", FieldSpec.DataType.INT) .addSingleValueDimension("column10", FieldSpec.DataType.INT) .addSingleValueDimension("column13", FieldSpec.DataType.INT) .addSingleValueDimension("count", FieldSpec.DataType.INT) .addSingleValueDimension("daysSinceEpoch", FieldSpec.DataType.INT) .addSingleValueDimension("weeksSinceEpochSunday", FieldSpec.DataType.INT).build(); defaultColumnHandler = new V3DefaultColumnHandler(segmentDirectory, schema6, committedSegmentMetadata, writer); Assert.assertEquals(defaultColumnHandler.computeDefaultColumnActionMap(), Collections.EMPTY_MAP); }
Map<String, DefaultColumnAction> computeDefaultColumnActionMap() { Map<String, DefaultColumnAction> defaultColumnActionMap = new HashMap<>(); Collection<String> columnsInSchema = _schema.getPhysicalColumnNames(); for (String column : columnsInSchema) { FieldSpec fieldSpecInSchema = _schema.getFieldSpecFor(column); Preconditions.checkNotNull(fieldSpecInSchema); FieldSpec.FieldType fieldTypeInSchema = fieldSpecInSchema.getFieldType(); ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata != null) { if (!columnMetadata.isAutoGenerated()) { continue; } FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata != fieldTypeInSchema) { String failureMessage = "Field type: " + fieldTypeInMetadata + " for auto-generated column: " + column + " does not match field type: " + fieldTypeInSchema + " in schema, throw exception to drop and re-download the segment."; throw new RuntimeException(failureMessage); } DataType dataTypeInMetadata = columnMetadata.getDataType(); DataType dataTypeInSchema = fieldSpecInSchema.getDataType(); boolean isSingleValueInMetadata = columnMetadata.isSingleValue(); boolean isSingleValueInSchema = fieldSpecInSchema.isSingleValueField(); String defaultValueInMetadata = columnMetadata.getDefaultNullValueString(); String defaultValueInSchema; if (dataTypeInSchema == DataType.BYTES) { defaultValueInSchema = BytesUtils.toHexString((byte[]) fieldSpecInSchema.getDefaultNullValue()); } else { defaultValueInSchema = fieldSpecInSchema.getDefaultNullValue().toString(); } if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DEFAULT_VALUE); } } } else { switch (fieldTypeInSchema) { case DIMENSION: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DIMENSION); break; case METRIC: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_METRIC); break; case DATE_TIME: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DATE_TIME); default: LOGGER.warn("Skip adding default column for column: {} with field type: {}", column, fieldTypeInSchema); break; } } } Set<String> columnsInMetadata = _segmentMetadata.getAllColumns(); for (String column : columnsInMetadata) { if (!columnsInSchema.contains(column)) { ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata.isAutoGenerated()) { FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DIMENSION); } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_METRIC); } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DATE_TIME); } } } } return defaultColumnActionMap; }
BaseDefaultColumnHandler implements DefaultColumnHandler { Map<String, DefaultColumnAction> computeDefaultColumnActionMap() { Map<String, DefaultColumnAction> defaultColumnActionMap = new HashMap<>(); Collection<String> columnsInSchema = _schema.getPhysicalColumnNames(); for (String column : columnsInSchema) { FieldSpec fieldSpecInSchema = _schema.getFieldSpecFor(column); Preconditions.checkNotNull(fieldSpecInSchema); FieldSpec.FieldType fieldTypeInSchema = fieldSpecInSchema.getFieldType(); ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata != null) { if (!columnMetadata.isAutoGenerated()) { continue; } FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata != fieldTypeInSchema) { String failureMessage = "Field type: " + fieldTypeInMetadata + " for auto-generated column: " + column + " does not match field type: " + fieldTypeInSchema + " in schema, throw exception to drop and re-download the segment."; throw new RuntimeException(failureMessage); } DataType dataTypeInMetadata = columnMetadata.getDataType(); DataType dataTypeInSchema = fieldSpecInSchema.getDataType(); boolean isSingleValueInMetadata = columnMetadata.isSingleValue(); boolean isSingleValueInSchema = fieldSpecInSchema.isSingleValueField(); String defaultValueInMetadata = columnMetadata.getDefaultNullValueString(); String defaultValueInSchema; if (dataTypeInSchema == DataType.BYTES) { defaultValueInSchema = BytesUtils.toHexString((byte[]) fieldSpecInSchema.getDefaultNullValue()); } else { defaultValueInSchema = fieldSpecInSchema.getDefaultNullValue().toString(); } if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DEFAULT_VALUE); } } } else { switch (fieldTypeInSchema) { case DIMENSION: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DIMENSION); break; case METRIC: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_METRIC); break; case DATE_TIME: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DATE_TIME); default: LOGGER.warn("Skip adding default column for column: {} with field type: {}", column, fieldTypeInSchema); break; } } } Set<String> columnsInMetadata = _segmentMetadata.getAllColumns(); for (String column : columnsInMetadata) { if (!columnsInSchema.contains(column)) { ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata.isAutoGenerated()) { FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DIMENSION); } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_METRIC); } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DATE_TIME); } } } } return defaultColumnActionMap; } }
BaseDefaultColumnHandler implements DefaultColumnHandler { Map<String, DefaultColumnAction> computeDefaultColumnActionMap() { Map<String, DefaultColumnAction> defaultColumnActionMap = new HashMap<>(); Collection<String> columnsInSchema = _schema.getPhysicalColumnNames(); for (String column : columnsInSchema) { FieldSpec fieldSpecInSchema = _schema.getFieldSpecFor(column); Preconditions.checkNotNull(fieldSpecInSchema); FieldSpec.FieldType fieldTypeInSchema = fieldSpecInSchema.getFieldType(); ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata != null) { if (!columnMetadata.isAutoGenerated()) { continue; } FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata != fieldTypeInSchema) { String failureMessage = "Field type: " + fieldTypeInMetadata + " for auto-generated column: " + column + " does not match field type: " + fieldTypeInSchema + " in schema, throw exception to drop and re-download the segment."; throw new RuntimeException(failureMessage); } DataType dataTypeInMetadata = columnMetadata.getDataType(); DataType dataTypeInSchema = fieldSpecInSchema.getDataType(); boolean isSingleValueInMetadata = columnMetadata.isSingleValue(); boolean isSingleValueInSchema = fieldSpecInSchema.isSingleValueField(); String defaultValueInMetadata = columnMetadata.getDefaultNullValueString(); String defaultValueInSchema; if (dataTypeInSchema == DataType.BYTES) { defaultValueInSchema = BytesUtils.toHexString((byte[]) fieldSpecInSchema.getDefaultNullValue()); } else { defaultValueInSchema = fieldSpecInSchema.getDefaultNullValue().toString(); } if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DEFAULT_VALUE); } } } else { switch (fieldTypeInSchema) { case DIMENSION: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DIMENSION); break; case METRIC: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_METRIC); break; case DATE_TIME: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DATE_TIME); default: LOGGER.warn("Skip adding default column for column: {} with field type: {}", column, fieldTypeInSchema); break; } } } Set<String> columnsInMetadata = _segmentMetadata.getAllColumns(); for (String column : columnsInMetadata) { if (!columnsInSchema.contains(column)) { ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata.isAutoGenerated()) { FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DIMENSION); } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_METRIC); } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DATE_TIME); } } } } return defaultColumnActionMap; } protected  BaseDefaultColumnHandler(File indexDir, Schema schema, SegmentMetadataImpl segmentMetadata,
      SegmentDirectory.Writer segmentWriter); }
BaseDefaultColumnHandler implements DefaultColumnHandler { Map<String, DefaultColumnAction> computeDefaultColumnActionMap() { Map<String, DefaultColumnAction> defaultColumnActionMap = new HashMap<>(); Collection<String> columnsInSchema = _schema.getPhysicalColumnNames(); for (String column : columnsInSchema) { FieldSpec fieldSpecInSchema = _schema.getFieldSpecFor(column); Preconditions.checkNotNull(fieldSpecInSchema); FieldSpec.FieldType fieldTypeInSchema = fieldSpecInSchema.getFieldType(); ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata != null) { if (!columnMetadata.isAutoGenerated()) { continue; } FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata != fieldTypeInSchema) { String failureMessage = "Field type: " + fieldTypeInMetadata + " for auto-generated column: " + column + " does not match field type: " + fieldTypeInSchema + " in schema, throw exception to drop and re-download the segment."; throw new RuntimeException(failureMessage); } DataType dataTypeInMetadata = columnMetadata.getDataType(); DataType dataTypeInSchema = fieldSpecInSchema.getDataType(); boolean isSingleValueInMetadata = columnMetadata.isSingleValue(); boolean isSingleValueInSchema = fieldSpecInSchema.isSingleValueField(); String defaultValueInMetadata = columnMetadata.getDefaultNullValueString(); String defaultValueInSchema; if (dataTypeInSchema == DataType.BYTES) { defaultValueInSchema = BytesUtils.toHexString((byte[]) fieldSpecInSchema.getDefaultNullValue()); } else { defaultValueInSchema = fieldSpecInSchema.getDefaultNullValue().toString(); } if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DEFAULT_VALUE); } } } else { switch (fieldTypeInSchema) { case DIMENSION: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DIMENSION); break; case METRIC: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_METRIC); break; case DATE_TIME: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DATE_TIME); default: LOGGER.warn("Skip adding default column for column: {} with field type: {}", column, fieldTypeInSchema); break; } } } Set<String> columnsInMetadata = _segmentMetadata.getAllColumns(); for (String column : columnsInMetadata) { if (!columnsInSchema.contains(column)) { ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata.isAutoGenerated()) { FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DIMENSION); } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_METRIC); } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DATE_TIME); } } } } return defaultColumnActionMap; } protected  BaseDefaultColumnHandler(File indexDir, Schema schema, SegmentMetadataImpl segmentMetadata,
      SegmentDirectory.Writer segmentWriter); @Override void updateDefaultColumns(IndexLoadingConfig indexLoadingConfig); }
BaseDefaultColumnHandler implements DefaultColumnHandler { Map<String, DefaultColumnAction> computeDefaultColumnActionMap() { Map<String, DefaultColumnAction> defaultColumnActionMap = new HashMap<>(); Collection<String> columnsInSchema = _schema.getPhysicalColumnNames(); for (String column : columnsInSchema) { FieldSpec fieldSpecInSchema = _schema.getFieldSpecFor(column); Preconditions.checkNotNull(fieldSpecInSchema); FieldSpec.FieldType fieldTypeInSchema = fieldSpecInSchema.getFieldType(); ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata != null) { if (!columnMetadata.isAutoGenerated()) { continue; } FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata != fieldTypeInSchema) { String failureMessage = "Field type: " + fieldTypeInMetadata + " for auto-generated column: " + column + " does not match field type: " + fieldTypeInSchema + " in schema, throw exception to drop and re-download the segment."; throw new RuntimeException(failureMessage); } DataType dataTypeInMetadata = columnMetadata.getDataType(); DataType dataTypeInSchema = fieldSpecInSchema.getDataType(); boolean isSingleValueInMetadata = columnMetadata.isSingleValue(); boolean isSingleValueInSchema = fieldSpecInSchema.isSingleValueField(); String defaultValueInMetadata = columnMetadata.getDefaultNullValueString(); String defaultValueInSchema; if (dataTypeInSchema == DataType.BYTES) { defaultValueInSchema = BytesUtils.toHexString((byte[]) fieldSpecInSchema.getDefaultNullValue()); } else { defaultValueInSchema = fieldSpecInSchema.getDefaultNullValue().toString(); } if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DIMENSION_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_DEFAULT_VALUE); } else if (isSingleValueInMetadata != isSingleValueInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_METRIC_NUMBER_OF_VALUES); } } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { if (dataTypeInMetadata != dataTypeInSchema) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DATA_TYPE); } else if (!defaultValueInSchema.equals(defaultValueInMetadata)) { defaultColumnActionMap.put(column, DefaultColumnAction.UPDATE_DATE_TIME_DEFAULT_VALUE); } } } else { switch (fieldTypeInSchema) { case DIMENSION: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DIMENSION); break; case METRIC: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_METRIC); break; case DATE_TIME: defaultColumnActionMap.put(column, DefaultColumnAction.ADD_DATE_TIME); default: LOGGER.warn("Skip adding default column for column: {} with field type: {}", column, fieldTypeInSchema); break; } } } Set<String> columnsInMetadata = _segmentMetadata.getAllColumns(); for (String column : columnsInMetadata) { if (!columnsInSchema.contains(column)) { ColumnMetadata columnMetadata = _segmentMetadata.getColumnMetadataFor(column); if (columnMetadata.isAutoGenerated()) { FieldSpec.FieldType fieldTypeInMetadata = columnMetadata.getFieldType(); if (fieldTypeInMetadata == FieldSpec.FieldType.DIMENSION) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DIMENSION); } else if (fieldTypeInMetadata == FieldSpec.FieldType.METRIC) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_METRIC); } else if (fieldTypeInMetadata == FieldSpec.FieldType.DATE_TIME) { defaultColumnActionMap.put(column, DefaultColumnAction.REMOVE_DATE_TIME); } } } } return defaultColumnActionMap; } protected  BaseDefaultColumnHandler(File indexDir, Schema schema, SegmentMetadataImpl segmentMetadata,
      SegmentDirectory.Writer segmentWriter); @Override void updateDefaultColumns(IndexLoadingConfig indexLoadingConfig);  }