Skip to content

Commit

Permalink
feat: Add TableTools.metaTable(TableDefinition) (#5885)
Browse files Browse the repository at this point in the history
  • Loading branch information
devinrsmith committed Aug 2, 2024
1 parent 974f9fb commit d1456b0
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ public interface Table extends
TableDefinition getDefinition();

/**
* Provides column metadata in Table form. Convenience method, behaves exactly the same as
* getDefinition().getColumnDefinitionsTable().
* Provides column metadata in Table form.
*
* @return A Table of metadata about this Table's columns.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import io.deephaven.api.util.ConcurrentMethod;
import io.deephaven.engine.util.ColumnFormatting;
import io.deephaven.engine.liveness.LivenessScopeStack;
import io.deephaven.engine.util.TableTools;
import io.deephaven.util.annotations.FinalDefault;

import javax.annotation.Nullable;
Expand Down Expand Up @@ -47,27 +48,7 @@ default Table coalesce() {
@ConcurrentMethod
@FinalDefault
default Table meta() {
List<String> columnNames = new ArrayList<>();
List<String> columnDataTypes = new ArrayList<>();
List<String> columnTypes = new ArrayList<>();
List<Boolean> columnPartitioning = new ArrayList<>();
for (ColumnDefinition<?> cDef : getDefinition().getColumns()) {
columnNames.add(cDef.getName());
final Class<?> dataType = cDef.getDataType();
final String dataTypeName = dataType.getCanonicalName();
columnDataTypes.add(dataTypeName == null ? dataType.getName() : dataTypeName);
columnTypes.add(cDef.getColumnType().name());
columnPartitioning.add(cDef.isPartitioning());
}
final String[] resultColumnNames = {"Name", "DataType", "ColumnType", "IsPartitioning"};
final Object[] resultValues = {
columnNames.toArray(String[]::new),
columnDataTypes.toArray(String[]::new),
columnTypes.toArray(String[]::new),
columnPartitioning.toArray(new Boolean[0]),
};

return new InMemoryTable(resultColumnNames, resultValues);
return TableTools.metaTable(getDefinition());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import io.deephaven.engine.rowset.RowSequence;
import io.deephaven.engine.rowset.RowSetFactory;
import io.deephaven.engine.table.*;
import io.deephaven.engine.table.impl.InMemoryTable;
import io.deephaven.engine.table.impl.perf.QueryPerformanceRecorder;
import io.deephaven.internal.log.LoggerFactory;
import io.deephaven.time.DateTimeUtils;
Expand Down Expand Up @@ -768,6 +769,47 @@ public static Table newTable(TableDefinition definition, ColumnHolder<?>... colu
};
}

/**
* Creates a metadata {@link Table} representing the columns in {@code definition}. Will include the following
* columns:
* <dl>
* <dt>Name</dt>
* <dd>{@link ColumnDefinition#getName()}</dd>
* <dt>DataType</dt>
* <dd>From {@link ColumnDefinition#getDataType()}, result of {@link Class#getCanonicalName()} if non-{@code null},
* else {@link Class#getName()}</dd>
* <dt>ColumnType</dt>
* <dd>{@code ColumnDefinition#getColumnType()}</dd>
* <dt>IsPartitioning</dt>
* <dd>{@link ColumnDefinition#isPartitioning()}</dd>
* </dl>
*
* @param definition the definition
* @return the metadata Table
*/
public static Table metaTable(TableDefinition definition) {
List<String> columnNames = new ArrayList<>();
List<String> columnDataTypes = new ArrayList<>();
List<String> columnTypes = new ArrayList<>();
List<Boolean> columnPartitioning = new ArrayList<>();
for (ColumnDefinition<?> cDef : definition.getColumns()) {
columnNames.add(cDef.getName());
final Class<?> dataType = cDef.getDataType();
final String dataTypeName = dataType.getCanonicalName();
columnDataTypes.add(dataTypeName == null ? dataType.getName() : dataTypeName);
columnTypes.add(cDef.getColumnType().name());
columnPartitioning.add(cDef.isPartitioning());
}
final String[] resultColumnNames = {"Name", "DataType", "ColumnType", "IsPartitioning"};
final Object[] resultValues = {
columnNames.toArray(String[]::new),
columnDataTypes.toArray(String[]::new),
columnTypes.toArray(String[]::new),
columnPartitioning.toArray(new Boolean[0]),
};
return new InMemoryTable(resultColumnNames, resultValues);
}

private static void checkSizes(ColumnHolder<?>[] columnHolders) {
final int[] sizes = Arrays.stream(columnHolders).mapToInt(ColumnHolder::size).toArray();
if (Arrays.stream(sizes).anyMatch(size -> size != sizes[0])) {
Expand Down

0 comments on commit d1456b0

Please sign in to comment.