/** * Does this table metadata contain a column by this name? * * @param columnName The name of the column to check * @return Whether a column by this name exists */ public boolean containsColumn(String columnName) { checkArgument(columnName != null, "Column name cannot be null"); return _columnMetadata.stream().anyMatch(cm -> columnName.equals(cm.getName())); }
public TableMetadata(List<ColumnMetadata> columnMetadata, @Nullable String textDesc) { checkArgument(columnMetadata != null, "Column metadata cannot be null"); checkArgument(!columnMetadata.isEmpty(), "The number of columns should be greater than zero"); // check if there is a duplicate column name Set<String> duplicateCheckSet = new HashSet<>(); for (ColumnMetadata cm : columnMetadata) { if (!duplicateCheckSet.add(cm.getName())) { throw new IllegalArgumentException( "Cannot have two columns with the same name '" + cm.getName() + "'"); } } // if textDesc is null, make one up using key columns if there are any or all columns if not String desc = textDesc; if (desc == null) { boolean haveKeyColumns = columnMetadata.stream().anyMatch(ColumnMetadata::getIsKey); desc = columnMetadata.stream() .filter(cm -> !haveKeyColumns || cm.getIsKey()) .map(cm -> String.format("${%s}", cm.getName())) .collect(Collectors.joining(" | ")); } _columnMetadata = columnMetadata; _textDesc = desc; }
@SuppressWarnings({"rawtypes", "unchecked"}) @VisibleForTesting @Nonnull Comparator<Row> columnComparator(ColumnMetadata columnMetadata) { Schema schema = columnMetadata.getSchema(); Comparator schemaComparator = schemaComparator(schema); Comparator comparator = comparing((Row r) -> r.get(columnMetadata.getName(), schema), nullsFirst(schemaComparator)); return comparator; }
/** * Returns the list of values in all columns declared as key in the metadata. * * @param metadata Provides information on which columns are key and their {@link Schema} * @return The list */ public List<Object> getKey(List<ColumnMetadata> metadata) { List<Object> keyList = new LinkedList<>(); for (ColumnMetadata column : metadata) { if (column.getIsKey()) { keyList.add(get(column.getName(), column.getSchema())); } } return keyList; }
/** * Returns the list of values in all columns declared as value in the metadata. * * @param metadata Provides information on which columns are key and their {@link Schema} * @return The list */ public List<Object> getValue(List<ColumnMetadata> metadata) { List<Object> valueList = new LinkedList<>(); for (ColumnMetadata column : metadata) { if (column.getIsValue()) { valueList.add(get(column.getName(), column.getSchema())); } } return valueList; }
/** * Returns a {@link TableMetadata} object based on the (outer) question and the metadata for the * innerquestion, by selecting only columns mentioned in the question. * * @param question The outer question * @param innerMetadata The inner metadata * @return The final metadata */ static TableMetadata createMetadata(FilterTableQuestion question, TableMetadata innerMetadata) { if (question.getColumns() == null) { return innerMetadata; } else { List<ColumnMetadata> innerColumns = innerMetadata.getColumnMetadata(); // check if columns mentions names that are not in the innermetadata Sets.SetView<String> unknownColumns = Sets.difference( question.getColumns(), innerColumns.stream().map(ColumnMetadata::getName).collect(Collectors.toSet())); if (!unknownColumns.isEmpty()) { throw new IllegalArgumentException("Unknown columns: " + unknownColumns); } List<ColumnMetadata> columnMetadata = innerColumns.stream() .filter(cm -> question.getColumns().contains(cm.getName())) .collect(Collectors.toList()); return new TableMetadata(columnMetadata, innerMetadata.getTextDesc()); } }
if (cm.getIsKey()) { diffColumnMetatadata.add( new ColumnMetadata(cm.getName(), cm.getSchema(), cm.getDescription(), true, false)); baseColumnName(cm.getName()), cm.getSchema(), cm.getDescription(), false, false), new ColumnMetadata( deltaColumnName(cm.getName()), cm.getSchema(), cm.getDescription(), false, false));
@Test public void testJacksonDeserializeWithDefaults() { ColumnMetadata c = ColumnMetadata.jsonCreator("name", Schema.STRING, "desc", null, null); assertThat(c.getName(), equalTo("name")); assertThat(c.getDescription(), equalTo("desc")); assertThat(c.getSchema(), equalTo(Schema.STRING)); assertThat(c.getIsKey(), equalTo(true)); assertThat(c.getIsValue(), equalTo(true)); }