AnswerMetadata newAnswerMetadata = AnswerMetadataUtil.computeAnswerMetadata(newAnswer, _logger); String answerStr = BatfishObjectMapper.writePrettyString(newAnswer); _storage.storeAnswer(answerStr, finalAnswerId);
@VisibleForTesting @Nonnull static Map<String, Map<Aggregation, Object>> computeColumnAggregations( @Nonnull TableAnswerElement table, @Nonnull List<ColumnAggregation> aggregations, @Nonnull BatfishLogger logger) { Map<String, Map<Aggregation, Object>> columnAggregations = new HashMap<>(); aggregations.stream() .map(columnAggregation -> computeColumnAggregation(table, columnAggregation, logger)) .filter(Objects::nonNull) .forEach( columnAggregationResult -> columnAggregations .computeIfAbsent(columnAggregationResult.getColumn(), c -> new HashMap<>()) .computeIfAbsent( columnAggregationResult.getAggregation(), a -> columnAggregationResult.getValue())); return CommonUtil.toImmutableMap( columnAggregations, Entry::getKey, columnAggregationsByColumnEntry -> CommonUtil.toImmutableMap( columnAggregationsByColumnEntry.getValue(), Entry::getKey, Entry::getValue)); }
new ColumnAggregation(aggregation, column)))); Map<String, Map<Aggregation, Object>> columnAggregationResults = computeColumnAggregations(table, columnAggregationsBuilder.build(), logger); Set<String> emptyColumns = computeEmptyColumns(table); Map<String, MajorIssueConfig> majorIssueTypes = computeMajorIssueConfigs(table); return Metrics.builder() .setAggregations(columnAggregationResults)
@VisibleForTesting @Nullable static ColumnAggregationResult computeColumnAggregation( @Nonnull TableAnswerElement table, @Nonnull ColumnAggregation columnAggregation, @Nonnull BatfishLogger logger) { Object value; String column = columnAggregation.getColumn(); Aggregation aggregation = columnAggregation.getAggregation(); switch (aggregation) { case MAX: value = computeColumnMax(table, column, logger); break; default: String message = String.format("Unhandled aggregation type: %s", aggregation); logger.errorf("%s\n", message); throw new IllegalArgumentException(message); } return value == null ? null : new ColumnAggregationResult(aggregation, column, value); }
@Test public void testComputeMajorIssueTypesNone() { String columnName = "col"; TableMetadata tableMetadata = new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.ISSUE, "foobar")), new DisplayHints().getTextDesc()); TableAnswerElement table = new TableAnswerElement(tableMetadata) .addRow(Row.builder(tableMetadata.toColumnMap()).build()); assertThat(AnswerMetadataUtil.computeMajorIssueConfigs(table), equalTo(ImmutableMap.of())); }
@Test public void testComputeColumnAggregations() { String columnName = "col"; int value = 5; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.INTEGER, "foobar")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, value)); List<ColumnAggregation> aggregations = ImmutableList.of(new ColumnAggregation(Aggregation.MAX, columnName)); assertThat( AnswerMetadataUtil.computeColumnAggregations(table, aggregations, _logger), equalTo(ImmutableMap.of(columnName, ImmutableMap.of(Aggregation.MAX, value)))); }
@Test public void testComputeEmptyColumns() { String fullColumn = "full"; String partialColumn = "partial"; String emptyColumn = "empty"; String val = "val"; Map<String, ColumnMetadata> columnMetadata = ImmutableMap.of( fullColumn, new ColumnMetadata(fullColumn, Schema.STRING, fullColumn), partialColumn, new ColumnMetadata(partialColumn, Schema.STRING, partialColumn), emptyColumn, new ColumnMetadata(emptyColumn, Schema.STRING, emptyColumn)); TableAnswerElement table = new TableAnswerElement( new TableMetadata( columnMetadata.values().stream().collect(ImmutableList.toImmutableList()))); table.addRow(Row.builder(columnMetadata).put(fullColumn, val).put(partialColumn, val).build()); table.addRow(Row.builder(columnMetadata).put(fullColumn, val).build()); assertThat( AnswerMetadataUtil.computeEmptyColumns(table), equalTo(ImmutableSet.of(emptyColumn))); }
public static @Nonnull AnswerMetadata computeAnswerMetadata( @Nonnull Answer answer, @Nonnull BatfishLogger logger) { try { return AnswerMetadata.builder() .setMetrics(computeMetrics(answer, logger)) .setStatus(answer.getStatus()) .build(); } catch (Exception e) { return AnswerMetadata.forStatus(AnswerStatus.FAILURE); } }
@Test public void testComputeColumnMaxNoRows() { String columnName = "col"; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.INTEGER, "foobar")), new DisplayHints().getTextDesc())); assertThat(AnswerMetadataUtil.computeColumnMax(table, columnName, _logger), nullValue()); }
@Test public void testComputeMajorIssueTypesNoColumn() { String columnName = "col"; String value = "foo"; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.STRING, "foobar")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, value)); assertThat(AnswerMetadataUtil.computeMajorIssueConfigs(table), equalTo(ImmutableMap.of())); }
@Test public void testComputeAnswerMetadataUnsuccessfulAnswer() throws IOException { Answer testAnswer = new Answer(); testAnswer.setStatus(AnswerStatus.FAILURE); assertThat( AnswerMetadataUtil.computeAnswerMetadata(testAnswer, _logger), equalTo(AnswerMetadata.forStatus(AnswerStatus.FAILURE))); }
@Test public void testComputeColumnMaxNullInteger() { String columnName = "col"; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.INTEGER, "foobar")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, null)); assertThat(AnswerMetadataUtil.computeColumnMax(table, columnName, _logger), nullValue()); }
@Test public void testComputeMajorIssueTypesSome() { String columnName = "col"; String major = "major"; String minor = "minor"; int severity = 5; Issue value = new Issue("a", severity, new Issue.Type(major, minor)); TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.ISSUE, "foobar")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, value)); assertThat( AnswerMetadataUtil.computeMajorIssueConfigs(table), equalTo( ImmutableMap.of( major, new MajorIssueConfig( major, ImmutableMap.of(minor, new MinorIssueConfig(minor, severity, null)))))); } }
@Test public void testComputeColumnAggregationMax() { String columnName = "col"; int value = 5; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.INTEGER, "foobar")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, value)) .addRow(Row.of(columnName, 2)); ColumnAggregation columnAggregation = new ColumnAggregation(Aggregation.MAX, columnName); assertThat( AnswerMetadataUtil.computeColumnAggregation(table, columnAggregation, _logger), equalTo(new ColumnAggregationResult(Aggregation.MAX, columnName, value))); }
String answer2Str = BatfishObjectMapper.writeString(answer2); AnswerMetadata answerMetadata1 = AnswerMetadataUtil.computeAnswerMetadata(answer1, Main.getLogger()); AnswerMetadata answerMetadata2 = AnswerMetadataUtil.computeAnswerMetadata(answer1, Main.getLogger()); _storage.storeAnswer(answer1Str, baseAnswerId1); _storage.storeAnswer(answer2Str, baseAnswerId2);
@Test public void testComputeColumnMaxInvalidSchema() { String columnName = "col"; String value = "hello"; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.STRING, "foobar")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, value)); assertThat(AnswerMetadataUtil.computeColumnMax(table, columnName, _logger), nullValue()); }
AnswerMetadataUtil.computeAnswerMetadata(answer, _logger), baseAnswerId);
@Test public void testComputeColumnMaxOneRowInteger() { String columnName = "col"; int value = 5; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.INTEGER, "foobar")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, value)); assertThat(AnswerMetadataUtil.computeColumnMax(table, columnName, _logger), equalTo(value)); }
String testAnswerStr = BatfishObjectMapper.writeString(testAnswer); AnswerMetadata answerMetadata = AnswerMetadataUtil.computeAnswerMetadata(testAnswer, Main.getLogger()); Main.getWorkMgr().getStorage().storeAnswer(testAnswerStr, answerId); Main.getWorkMgr().getStorage().storeAnswerMetadata(answerMetadata, answerId);
@Test public void testComputeColumnMaxTwoRows() { String columnName = "col"; int value1 = 5; int value2 = 10; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.INTEGER, "foobar")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, value1)) .addRow(Row.of(columnName, value2)); assertThat(AnswerMetadataUtil.computeColumnMax(table, columnName, _logger), equalTo(value2)); }