@Override public AnswerElement answer() { FilterTableQuestion question = (FilterTableQuestion) _question; Question innerQuestion = question.getInnerQuestion(); AnswerElement innerAnswer = _batfish.createAnswerer(innerQuestion).answer(); if (!(innerAnswer instanceof TableAnswerElement)) { throw new IllegalArgumentException("The inner question does not produce table answers"); } TableAnswerElement innerTable = (TableAnswerElement) innerAnswer; TableAnswerElement answer = new TableAnswerElement(createMetadata(question, innerTable.getMetadata())); Multiset<Row> answerRows = innerTable.getRows().getData(); if (question.getFilter() != null) { answerRows = filterRows(question.getFilter(), answerRows); } if (question.getColumns() != null) { answerRows = selectColumns(question.getColumns(), answerRows); } answer.postProcessAnswer(question, answerRows); return answer; }
.readValue(_storage.loadAnswer(baseAnswerId), new TypeReference<Answer>() {}); TableAnswerElement oldTable = (TableAnswerElement) oldAnswer.getAnswerElements().get(0); TableMetadata tableMetadata = oldTable.getMetadata(); Set<String> issueColumns = tableMetadata.getColumnMetadata().stream() applyIssuesConfigurationToRows(oldTable.getRowsList(), issueColumns, majorIssueConfigs) .forEach(allRows::add); applyIssuesConfigurationToAllExcludedRows( oldTable.getExcludedRows(), issueColumns, majorIssueConfigs) .map(ExcludedRows::getRowsList) .flatMap(Collection::stream) TableAnswerElement newTable = new TableAnswerElement(tableMetadata); newTable.postProcessAnswer(questionObj, allRows.build()); Answer newAnswer = new Answer(); newAnswer.setSummary(newTable.getSummary()); newAnswer.setAnswerElements(ImmutableList.of(newTable));
/** * Given an initial set of rows produced by an {@link org.batfish.common.Answerer}, this procedure * processes exclusions, assertions, and summary to update this object. * * @param question The question that generated the initial set of rows * @param initialSet The initial set of rows */ public void postProcessAnswer(Question question, Iterable<Row> initialSet) { initialSet.forEach( initialRow -> { // exclude or not? Exclusion exclusion = Exclusion.covered(initialRow, question.getExclusions()); if (exclusion != null) { addExcludedRow(initialRow, exclusion.getName()); } else { addRow(initialRow); } }); setSummary(computeSummary(question.getAssertion())); }
@Override public AnswerElement answer() { BgpSessionStatusQuestion question = (BgpSessionStatusQuestion) _question; TableAnswerElement answer = new TableAnswerElement(createMetadata(question)); answer.postProcessAnswer(question, getRows(question)); return answer; }
@VisibleForTesting static Set<String> computeEmptyColumns(TableAnswerElement table) { return table.getMetadata().toColumnMap().keySet().stream() .filter(column -> table.getRowsList().stream().allMatch(row -> !row.hasNonNull(column))) .collect(ImmutableSet.toImmutableSet()); }
@Test public void testProcessAnswerTableMaxRows() { String columnName = "val"; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.INTEGER, "foobar")))); Row row1 = Row.of(columnName, 1); Row row2 = Row.of(columnName, 2); table.addRow(row1); table.addRow(row2); AnswerRowsOptions optionsNoLimit = new AnswerRowsOptions( ImmutableSet.of(), ImmutableList.of(), Integer.MAX_VALUE, 0, ImmutableList.of(), false); AnswerRowsOptions optionsLimit = new AnswerRowsOptions( ImmutableSet.of(), ImmutableList.of(), 1, 0, ImmutableList.of(), false); assertThat( _manager.processAnswerTable(table, optionsNoLimit).getRowsList(), equalTo(ImmutableList.of(row1, row2))); assertThat( _manager.processAnswerTable(table, optionsLimit).getRowsList(), equalTo(ImmutableList.of(row1))); }
@Test public void testAddEmptyRow() { TableAnswerElement table = new TableAnswerElement(oneKeyTableMetadata); Row row = Row.builder().build(); _thrown.expect(IllegalArgumentException.class); _thrown.expectMessage( String.format( "Row columns %s do not match metadata columns metadata %s", row.getColumnNames(), oneKeyTableMetadata.toColumnMap().keySet())); table.addRow(row); }
@VisibleForTesting static TableAnswerElement resolveLocation(SpecifiersQuestion question, SpecifierContext context) { List<ColumnMetadata> columns = ImmutableList.of(new ColumnMetadata(COL_LOCATION, Schema.STRING, "Location", false, false)); TableAnswerElement table = new TableAnswerElement(new TableMetadata(columns)); Map<String, ColumnMetadata> columnMap = table.getMetadata().toColumnMap(); Set<Location> locations = question.getLocationSpecifier().resolve(context); for (Location location : locations) { table.addRow(Row.of(columnMap, COL_LOCATION, location.toString())); } return table; }
@Override protected Iterable<Row> featureValueOf(TableAnswerElement actual) { return () -> actual.getRows().iterator(); } }
@VisibleForTesting @Nonnull TableAnswerElement processAnswerTable(TableAnswerElement rawTable, AnswerRowsOptions options) { Map<String, ColumnMetadata> rawColumnMap = rawTable.getMetadata().toColumnMap(); List<Row> filteredRows = rawTable.getRowsList().stream() .filter(row -> options.getFilters().stream().allMatch(filter -> filter.matches(row))) .collect(ImmutableList.toImmutableList()); table = new TableAnswerElement(rawTable.getMetadata()); } else { columnMap.values().stream().collect(ImmutableList.toImmutableList()); table = new TableAnswerElement( new TableMetadata(columnMetadata, rawTable.getMetadata().getTextDesc())); table.setSummary(rawTable.getSummary() != null ? rawTable.getSummary() : new AnswerSummary()); table.getSummary().setNumResults(filteredRows.size()); return table;
oldAnswer.setStatus(AnswerStatus.SUCCESS); TableAnswerElement oldTable = new TableAnswerElement( new TableMetadata(ImmutableList.of(new ColumnMetadata(col, Schema.ISSUE, "desc")))); oldTable.addRow(Row.of(col, new Issue("blah", 1, new Issue.Type(major, minor)))); oldTable.addExcludedRow( Row.of(col, new Issue("blorp", 1, new Issue.Type(major, minor))), "exc"); oldAnswer.setAnswerElements(ImmutableList.of(oldTable)); assertThat(newTable.getRowsList(), not(equalTo(oldTable.getRowsList()))); assertThat(newTable.getExcludedRows(), emptyIterable());
@Test public void testProcessAnswerTableFiltered() { String columnName = "val"; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.STRING, "foobar")))); String whitelistedValue = "hello"; Row row1 = Row.of(columnName, whitelistedValue); Row row2 = Row.of(columnName, "goodbye"); table.addRow(row1); table.addRow(row2); AnswerRowsOptions optionsNotFiltered = new AnswerRowsOptions( ImmutableSet.of(), ImmutableList.of(), Integer.MAX_VALUE, 0, ImmutableList.of(), false); AnswerRowsOptions optionsFiltered = new AnswerRowsOptions( ImmutableSet.of(), ImmutableList.of(new ColumnFilter(columnName, whitelistedValue)), Integer.MAX_VALUE, 0, ImmutableList.of(), false); TableAnswerElement notFiltered = _manager.processAnswerTable(table, optionsNotFiltered); TableAnswerElement filtered = _manager.processAnswerTable(table, optionsFiltered); assertThat(notFiltered.getRowsList(), equalTo(ImmutableList.of(row1, row2))); assertThat(filtered.getRowsList(), equalTo(ImmutableList.of(row1))); assertThat(notFiltered.getSummary().getNumResults(), equalTo(2)); assertThat(filtered.getSummary().getNumResults(), equalTo(1)); }
@Test public void testAddValidRow() { TableAnswerElement table = new TableAnswerElement(twoKeyTableMetadata); Row row = Row.builder().put("key1", null).put("key2", null).build(); table.addRow(row); assertThat(table.getRows().getData(), contains(row)); }
int numRows = table.getRowsList().size(); int numExcludedRows = table.getExcludedRows().stream().map(ExcludedRows::getRowsList).mapToInt(List::size).sum(); ImmutableList.Builder<ColumnAggregation> columnAggregationsBuilder = ImmutableList.builder(); table.getMetadata().getColumnMetadata().stream() .map(ColumnMetadata::getName) .forEach(
TableView processAnswerTable2(TableAnswerElement rawTable, AnswerRowsOptions options) { Map<Row, Integer> rowIds = Maps.newIdentityHashMap(); CommonUtil.forEachWithIndex(rawTable.getRowsList(), (i, row) -> rowIds.put(row, i)); Map<String, ColumnMetadata> rawColumnMap = rawTable.getMetadata().toColumnMap(); List<Row> filteredRows = rawTable.getRowsList().stream() .filter(row -> options.getFilters().stream().allMatch(filter -> filter.matches(row))) .collect(ImmutableList.toImmutableList()); tableMetadata = rawTable.getMetadata(); } else { List<ColumnMetadata> columnMetadata = columnMap.values().stream().collect(ImmutableList.toImmutableList()); tableMetadata = new TableMetadata(columnMetadata, rawTable.getMetadata().getTextDesc()); tableMetadata); tableView.setSummary( rawTable.getSummary() != null ? rawTable.getSummary() : new AnswerSummary()); tableView.getSummary().setNumResults(filteredRows.size()); return tableView;
assertThat(answer.getRows().size(), equalTo(1)); assertThat(answer.getExcludedRows().size(), equalTo(1)); .getRows() .contains( Row.of( assertThat(answer.getSummary().getNumResults(), equalTo(1));
new TableAnswerElement( new TableMetadata( ImmutableList.of( new ColumnMetadata(issueColumnName, Schema.ISSUE, "barfoo")), new DisplayHints().getTextDesc())) .addRow(Row.of(columnName, value, issueColumnName, issueValue)) .addExcludedRow(Row.of(columnName, excludedValue, issueColumnName, issueValue), "foo")); testAnswer.setStatus(AnswerStatus.SUCCESS);
/** Does computerSummary compute the correct summary? */ @Test public void testComputeSummary() { // generate an answer with two rows TableAnswerElement answer = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata("col", Schema.STRING, "desc")), "no desc")); answer.addRow(Row.builder().put("col", "val").build()); answer.addRow(Row.builder().put("col", "val").build()); Assertion assertion = new Assertion(AssertionType.countequals, new IntNode(1)); // wrong count AnswerSummary summary = answer.computeSummary(assertion); assertThat(summary.getNumResults(), equalTo(2)); assertThat(summary.getNumFailed(), equalTo(1)); assertThat(summary.getNumPassed(), equalTo(0)); }
@Test public void testFilterMlags() { ImmutableSortedMap<String, Configuration> configs = getConfigs(); TableAnswerElement answer = computeAnswer(ImmutableSet.of("n1", "n2"), Pattern.compile(".*2"), configs); assertThat( answer.getRowsList(), contains( allOf( hasColumn(equalTo(COL_NODE), equalTo(new Node("n2")), Schema.NODE), hasColumn(equalTo(COL_MLAG_ID), equalTo("ID2"), Schema.STRING)))); }
private static TableAnswerElement toSearchFiltersTable( TableAnswerElement tableAnswerElement, boolean generateExplanation) { Map<String, ColumnMetadata> columnMap = tableAnswerElement.getMetadata().toColumnMap(); List<ColumnMetadata> columnMetadata = new ArrayList<>(); columnMetadata.add(columnMap.get(TestFiltersAnswerer.COL_NODE)); columnMetadata.add(columnMap.get(TestFiltersAnswerer.COL_FILTER_NAME)); if (generateExplanation) { columnMetadata.add( new ColumnMetadata(COL_HEADER_SPACE, Schema.STRING, "Description of HeaderSpace")); } columnMetadata.add(columnMap.get(TestFiltersAnswerer.COL_FLOW)); columnMetadata.add(columnMap.get(TestFiltersAnswerer.COL_ACTION)); columnMetadata.add(columnMap.get(TestFiltersAnswerer.COL_LINE_CONTENT)); columnMetadata.add(columnMap.get(TestFiltersAnswerer.COL_TRACE)); TableMetadata metadata = new TableMetadata(columnMetadata); return new TableAnswerElement(metadata); }