DataSourceMetadata columnMetadata = indexSegment.getDataSource(columnName).getDataSourceMetadata(); columnDataTypes[i] = DataSchema.ColumnDataType.fromDataType(columnMetadata.getDataType(), columnMetadata.isSingleValue());
/** * Returns whether the given data schema is type compatible with this one. * <ul> * <li>All numbers are type compatible with each other</li> * <li>Numbers are not type compatible with string</li> * <li>Non-array types are not type compatible with array types</li> * </ul> * * @param anotherDataSchema Data schema to compare with * @return Whether the two data schemas are type compatible */ public boolean isTypeCompatibleWith(@Nonnull DataSchema anotherDataSchema) { if (!Arrays.equals(_columnNames, anotherDataSchema._columnNames)) { return false; } int numColumns = _columnNames.length; for (int i = 0; i < numColumns; i++) { if (!_columnDataTypes[i].isCompatible(anotherDataSchema._columnDataTypes[i])) { return false; } } return true; }
@Nonnull public byte[] toBytes() throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); int length = _columnNames.length; // Write the number of columns. dataOutputStream.writeInt(length); // Write the column names. for (String columnName : _columnNames) { byte[] bytes = StringUtil.encodeUtf8(columnName); dataOutputStream.writeInt(bytes.length); dataOutputStream.write(bytes); } // Write the column types. for (ColumnDataType columnDataType : _columnDataTypes) { // We don't want to use ordinal of the enum since adding a new data type will break things if server and broker // use different versions of DataType class. byte[] bytes = StringUtil.encodeUtf8(columnDataType.name()); dataOutputStream.writeInt(bytes.length); dataOutputStream.write(bytes); } return byteArrayOutputStream.toByteArray(); }
@Test public void testAllDataTypes() throws IOException { DataSchema.ColumnDataType[] columnDataTypes = DataSchema.ColumnDataType.values(); int numColumns = columnDataTypes.length; String[] columnNames = new String[numColumns]; for (int i = 0; i < numColumns; i++) { columnNames[i] = columnDataTypes[i].name();
@Test public void testColumnDataType() { for (DataSchema.ColumnDataType columnDataType : new DataSchema.ColumnDataType[]{INT, LONG}) { Assert.assertTrue(columnDataType.isNumber()); Assert.assertTrue(columnDataType.isWholeNumber()); Assert.assertFalse(columnDataType.isArray()); Assert.assertFalse(columnDataType.isNumberArray()); Assert.assertFalse(columnDataType.isWholeNumberArray()); Assert.assertTrue(columnDataType.isCompatible(DOUBLE)); Assert.assertFalse(columnDataType.isCompatible(STRING)); Assert.assertFalse(columnDataType.isCompatible(DOUBLE_ARRAY)); Assert.assertFalse(columnDataType.isCompatible(STRING_ARRAY)); Assert.assertTrue(columnDataType.isNumber()); Assert.assertFalse(columnDataType.isWholeNumber()); Assert.assertFalse(columnDataType.isArray()); Assert.assertFalse(columnDataType.isNumberArray()); Assert.assertFalse(columnDataType.isWholeNumberArray()); Assert.assertTrue(columnDataType.isCompatible(LONG)); Assert.assertFalse(columnDataType.isCompatible(STRING)); Assert.assertFalse(columnDataType.isCompatible(LONG_ARRAY)); Assert.assertFalse(columnDataType.isCompatible(STRING_ARRAY)); Assert.assertFalse(STRING.isNumber()); Assert.assertFalse(STRING.isWholeNumber()); Assert.assertFalse(STRING.isArray()); Assert.assertFalse(STRING.isNumberArray()); Assert.assertFalse(STRING.isWholeNumberArray()); Assert.assertFalse(STRING.isCompatible(DOUBLE)); Assert.assertTrue(STRING.isCompatible(STRING));
ColumnDataType thatColumnDataType = anotherDataSchema._columnDataTypes[i]; if (thisColumnDataType != thatColumnDataType) { if (thisColumnDataType.isArray()) { if (thisColumnDataType.isWholeNumberArray() && thatColumnDataType.isWholeNumberArray()) { _columnDataTypes[i] = ColumnDataType.LONG_ARRAY; } else { if (thisColumnDataType.isWholeNumber() && thatColumnDataType.isWholeNumber()) { _columnDataTypes[i] = ColumnDataType.LONG; } else {
@Nonnull public static DataSchema fromBytes(@Nonnull byte[] buffer) throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer); DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream); // Read the number of columns. int numColumns = dataInputStream.readInt(); String[] columnNames = new String[numColumns]; ColumnDataType[] columnDataTypes = new ColumnDataType[numColumns]; // Read the column names. int readLength; for (int i = 0; i < numColumns; i++) { int length = dataInputStream.readInt(); byte[] bytes = new byte[length]; readLength = dataInputStream.read(bytes); assert readLength == length; columnNames[i] = StringUtil.decodeUtf8(bytes); } // Read the column types. for (int i = 0; i < numColumns; i++) { int length = dataInputStream.readInt(); byte[] bytes = new byte[length]; readLength = dataInputStream.read(bytes); assert readLength == length; columnDataTypes[i] = ColumnDataType.valueOf(StringUtil.decodeUtf8(bytes)); } return new DataSchema(columnNames, columnDataTypes); }
public boolean isCompatible(ColumnDataType anotherColumnDataType) { // All numbers are compatible with each other return this == anotherColumnDataType || (this.isNumber() && anotherColumnDataType.isNumber()) || ( this.isNumberArray() && anotherColumnDataType.isNumberArray()); }