@SuppressWarnings("CloneDoesntCallSuperClone") @Override public DataSchema clone() { return new DataSchema(_columnNames.clone(), _columnDataTypes.clone()); }
@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); }
@Test public void testTypeCompatible() { DataSchema dataSchema = new DataSchema(COLUMN_NAMES, COLUMN_DATA_TYPES); DataSchema compatibleDataSchema = new DataSchema(COLUMN_NAMES, COMPATIBLE_COLUMN_DATA_TYPES); Assert.assertTrue(dataSchema.isTypeCompatibleWith(compatibleDataSchema)); String[] anotherColumnNames = new String[NUM_COLUMNS]; Arrays.fill(anotherColumnNames, "foo"); DataSchema incompatibleDataSchema = new DataSchema(anotherColumnNames, COLUMN_DATA_TYPES); Assert.assertFalse(dataSchema.isTypeCompatibleWith(incompatibleDataSchema)); dataSchema.upgradeToCover(compatibleDataSchema); DataSchema upgradedDataSchema = new DataSchema(COLUMN_NAMES, UPGRADED_COLUMN_DATA_TYPES); Assert.assertEquals(dataSchema, upgradedDataSchema); }
@Test public void testToString() { DataSchema dataSchema = new DataSchema(COLUMN_NAMES, COLUMN_DATA_TYPES); Assert.assertEquals(dataSchema.toString(), "[int(INT),long(LONG),float(FLOAT),double(DOUBLE),string(STRING),object(OBJECT),int_array(INT_ARRAY),long_array(LONG_ARRAY),float_array(FLOAT_ARRAY),double_array(DOUBLE_ARRAY),string_array(STRING_ARRAY)]"); }
return new DataSchema(columnNames, columnDataTypes);
@Nonnull private DataTable getAggregationGroupByResultDataTable() throws Exception { String[] columnNames = new String[]{"functionName", "GroupByResultMap"}; DataSchema.ColumnDataType[] columnDataTypes = new DataSchema.ColumnDataType[]{DataSchema.ColumnDataType.STRING, DataSchema.ColumnDataType.OBJECT}; // Build the data table. DataTableBuilder dataTableBuilder = new DataTableBuilder(new DataSchema(columnNames, columnDataTypes)); int numAggregationFunctions = _aggregationFunctionContexts.length; for (int i = 0; i < numAggregationFunctions; i++) { dataTableBuilder.startRow(); AggregationFunctionContext aggregationFunctionContext = _aggregationFunctionContexts[i]; dataTableBuilder.setColumn(0, aggregationFunctionContext.getAggregationColumnName()); dataTableBuilder.setColumn(1, _combinedAggregationGroupByResult.get(i)); dataTableBuilder.finishRow(); } DataTable dataTable = dataTableBuilder.build(); return attachMetadataToDataTable(dataTable); }
@Test public void testGetters() { DataSchema dataSchema = new DataSchema(COLUMN_NAMES, COLUMN_DATA_TYPES); Assert.assertEquals(dataSchema.size(), NUM_COLUMNS); for (int i = 0; i < NUM_COLUMNS; i++) { Assert.assertEquals(dataSchema.getColumnName(i), COLUMN_NAMES[i]); Assert.assertEquals(dataSchema.getColumnDataType(i), COLUMN_DATA_TYPES[i]); } }
@Test public void testClone() { DataSchema dataSchema = new DataSchema(COLUMN_NAMES, COLUMN_DATA_TYPES); DataSchema dataSchemaClone = dataSchema.clone(); Assert.assertEquals(dataSchema, dataSchemaClone); Assert.assertEquals(dataSchema.hashCode(), dataSchemaClone.hashCode()); }
DataTableBuilder dataTableBuilder = new DataTableBuilder(new DataSchema(columnNames, columnDataTypes)); dataTableBuilder.startRow(); for (int i = 0; i < numAggregationFunctions; i++) {
@Test public void testSerDe() throws Exception { DataSchema dataSchema = new DataSchema(COLUMN_NAMES, COLUMN_DATA_TYPES); DataSchema dataSchemaAfterSerDe = DataSchema.fromBytes(dataSchema.toBytes()); Assert.assertEquals(dataSchema, dataSchemaAfterSerDe); Assert.assertEquals(dataSchema.hashCode(), dataSchemaAfterSerDe.hashCode()); }
new DataSchema(selectionColumns.toArray(new String[numSelectionColumns]), columnDataTypes); return new DataTableBuilder(dataSchema).build(); DataTableBuilder dataTableBuilder = new DataTableBuilder(new DataSchema(columnNames, columnDataTypes)); for (int i = 0; i < numAggregations; i++) { dataTableBuilder.startRow(); DataTableBuilder dataTableBuilder = new DataTableBuilder(new DataSchema(aggregationColumnNames, columnDataTypes)); dataTableBuilder.startRow(); for (int i = 0; i < numAggregations; i++) {
@Test public void testEmptyStrings() throws IOException { String emptyString = StringUtils.EMPTY; String[] emptyStringArray = {StringUtils.EMPTY}; DataSchema dataSchema = new DataSchema(new String[]{"SV", "MV"}, new DataSchema.ColumnDataType[]{DataSchema.ColumnDataType.STRING, DataSchema.ColumnDataType.STRING_ARRAY}); DataTableBuilder dataTableBuilder = new DataTableBuilder(dataSchema); for (int rowId = 0; rowId < NUM_ROWS; rowId++) { dataTableBuilder.startRow(); dataTableBuilder.setColumn(0, emptyString); dataTableBuilder.setColumn(1, emptyStringArray); dataTableBuilder.finishRow(); } DataTable dataTable = dataTableBuilder.build(); DataTable newDataTable = DataTableFactory.getDataTable(dataTable.toBytes()); Assert.assertEquals(newDataTable.getDataSchema(), dataSchema); Assert.assertEquals(newDataTable.getNumberOfRows(), NUM_ROWS); for (int rowId = 0; rowId < NUM_ROWS; rowId++) { Assert.assertEquals(newDataTable.getString(rowId, 0), emptyString); Assert.assertEquals(newDataTable.getStringArray(rowId, 1), emptyStringArray); } }
@Nonnull @Override public ListenableFuture<byte[]> submit(@Nonnull ServerQueryRequest queryRequest) { ListenableFuture<DataTable> response = resourceManager.getQueryRunners().submit(() -> { String[] columnNames = new String[]{"foo", "bar"}; DataSchema.ColumnDataType[] columnDataTypes = new DataSchema.ColumnDataType[]{DataSchema.ColumnDataType.STRING, DataSchema.ColumnDataType.INT}; DataSchema dataSchema = new DataSchema(columnNames, columnDataTypes); DataTableBuilder dtBuilder = new DataTableBuilder(dataSchema); dtBuilder.startRow(); dtBuilder.setColumn(0, "mars"); dtBuilder.setColumn(1, 10); dtBuilder.finishRow(); dtBuilder.startRow(); dtBuilder.setColumn(0, "jupiter"); dtBuilder.setColumn(1, 100); dtBuilder.finishRow(); return dtBuilder.build(); }); return serializeData(response); }
columnNames[i] = columnDataTypes[i].name(); DataSchema dataSchema = new DataSchema(columnNames, columnDataTypes);