@JsonCreator private static @Nonnull AnswerRowsOptions create( @JsonProperty(BfConsts.PROP_COLUMNS) Set<String> columns, @JsonProperty(BfConsts.PROP_FILTERS) List<ColumnFilter> filters, @JsonProperty(BfConsts.PROP_MAX_ROWS) Integer maxRows, @JsonProperty(BfConsts.PROP_ROW_OFFSET) Integer rowOffset, @JsonProperty(BfConsts.PROP_SORT_ORDER) List<ColumnSortOption> sortOrder, @JsonProperty(BfConsts.PROP_UNIQUE_ROWS) Boolean uniqueRows) { return new AnswerRowsOptions( firstNonNull(columns, ImmutableSet.of()), firstNonNull(filters, ImmutableList.of()), firstNonNull(maxRows, Integer.MAX_VALUE), firstNonNull(rowOffset, 0), firstNonNull(sortOrder, ImmutableList.of()), firstNonNull(uniqueRows, false)); }
List<Row> filteredRows = rawTable.getRowsList().stream() .filter(row -> options.getFilters().stream().allMatch(filter -> filter.matches(row))) .collect(ImmutableList.toImmutableList()); if (!options.getSortOrder().isEmpty()) { rowStream = rowStream.sorted(buildComparator(rawColumnMap, options.getSortOrder())); if (options.getColumns().isEmpty()) { table = new TableAnswerElement(rawTable.getMetadata()); } else { rowStream.map(rawRow -> Row.builder().putAll(rawRow, options.getColumns()).build()); Map<String, ColumnMetadata> columnMap = new LinkedHashMap<>(rawColumnMap); columnMap.keySet().retainAll(options.getColumns()); List<ColumnMetadata> columnMetadata = columnMap.values().stream().collect(ImmutableList.toImmutableList()); new TableMetadata(columnMetadata, rawTable.getMetadata().getTextDesc())); if (options.getUniqueRows()) { rowStream.skip(options.getRowOffset()).limit(options.getMaxRows()).forEach(table::addRow); table.setSummary(rawTable.getSummary() != null ? rawTable.getSummary() : new AnswerSummary()); table.getSummary().setNumResults(filteredRows.size());
@Test public void testProcessAnswerRowsNotFound() throws IOException { String columnName = "issue"; int maxRows = 1; int rowOffset = 0; AnswerRowsOptions options = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(), maxRows, rowOffset, ImmutableList.of(new ColumnSortOption(columnName, true)), false); Answer processedAnswer = _manager.processAnswerRows(null, options); assertThat(processedAnswer.getStatus(), equalTo(AnswerStatus.NOTFOUND)); }
List<Row> filteredRows = rawTable.getRowsList().stream() .filter(row -> options.getFilters().stream().allMatch(filter -> filter.matches(row))) .collect(ImmutableList.toImmutableList()); if (!options.getSortOrder().isEmpty()) { rowStream = rowStream.sorted(buildComparator(rawColumnMap, options.getSortOrder())); if (options.getColumns().isEmpty()) { tableMetadata = rawTable.getMetadata(); } else { rowStream.map( rawRow -> { Row row = Row.builder().putAll(rawRow, options.getColumns()).build(); rowIds.put(row, rowIds.get(rawRow)); return row; }); Map<String, ColumnMetadata> columnMap = new LinkedHashMap<>(rawColumnMap); columnMap.keySet().retainAll(options.getColumns()); List<ColumnMetadata> columnMetadata = columnMap.values().stream().collect(ImmutableList.toImmutableList()); tableMetadata = new TableMetadata(columnMetadata, rawTable.getMetadata().getTextDesc()); if (options.getUniqueRows()) { options, rowStream
@Test public void testProcessAnswerTableUniqueRows() { 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, 1); table.addRow(row1); table.addRow(row2); AnswerRowsOptions optionsNonUnique = new AnswerRowsOptions( ImmutableSet.of(), ImmutableList.of(), Integer.MAX_VALUE, 0, ImmutableList.of(), false); AnswerRowsOptions optionsUnique = new AnswerRowsOptions( ImmutableSet.of(), ImmutableList.of(), Integer.MAX_VALUE, 0, ImmutableList.of(), true); assertThat( _manager.processAnswerTable(table, optionsNonUnique).getRowsList(), equalTo(ImmutableList.of(row1, row2))); assertThat( _manager.processAnswerTable(table, optionsUnique).getRowsList(), equalTo(ImmutableList.of(row1))); }
@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 testProcessAnswerRowsFailure() throws IOException { String columnName = "issue"; int maxRows = 1; int rowOffset = 0; AnswerRowsOptions options = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(), maxRows, rowOffset, ImmutableList.of(new ColumnSortOption(columnName, true)), false); Answer badInput = new Answer(); badInput.setStatus(AnswerStatus.SUCCESS); String rawAnswerStr = BatfishObjectMapper.writePrettyString(badInput); Answer processedAnswer = _manager.processAnswerRows(rawAnswerStr, options); assertThat(processedAnswer.getStatus(), equalTo(AnswerStatus.FAILURE)); }
@Test public void testProcessAnswerRowsStale() throws IOException { String columnName = "issue"; int maxRows = 1; int rowOffset = 0; AnswerRowsOptions options = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(), maxRows, rowOffset, ImmutableList.of(new ColumnSortOption(columnName, true)), false); Answer badInput = new Answer(); badInput.setStatus(AnswerStatus.STALE); String rawAnswerStr = BatfishObjectMapper.writePrettyString(badInput); Answer processedAnswer = _manager.processAnswerRows(rawAnswerStr, options); assertThat(processedAnswer.getStatus(), equalTo(AnswerStatus.STALE)); }
table.addRow(row2); AnswerRowsOptions optionsNoOffset = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(), false); AnswerRowsOptions optionsOffset = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(),
table.addRow(row2); AnswerRowsOptions optionsNoProject = new AnswerRowsOptions( ImmutableSet.of(), ImmutableList.of(), Integer.MAX_VALUE, 0, ImmutableList.of(), false); AnswerRowsOptions optionsProject = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(),
table.addRow(row2); AnswerRowsOptions optionsNoProject = new AnswerRowsOptions( ImmutableSet.of(), ImmutableList.of(), Integer.MAX_VALUE, 0, ImmutableList.of(), false); AnswerRowsOptions optionsProject = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(),
@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 testProcessAnswerTable2Filtered() { 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); TableView notFiltered = _manager.processAnswerTable2(table, optionsNotFiltered); TableView filtered = _manager.processAnswerTable2(table, optionsFiltered); assertThat(notFiltered.getInnerRows(), equalTo(ImmutableList.of(row1, row2))); assertThat(filtered.getInnerRows(), equalTo(ImmutableList.of(row1))); assertThat(notFiltered.getSummary().getNumResults(), equalTo(2)); assertThat(filtered.getSummary().getNumResults(), equalTo(1)); }
table.addRow(row2); AnswerRowsOptions optionsSorting = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(), false); AnswerRowsOptions optionsSortingReverse = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(),
@Test public void testEquals() { AnswerRowsOptions group1Elem1 = new AnswerRowsOptions( ImmutableSet.of("a"), ImmutableList.of(new ColumnFilter("a", "1")), false); AnswerRowsOptions group1Elem2 = new AnswerRowsOptions( ImmutableSet.of("a"), ImmutableList.of(new ColumnFilter("a", "1")), false); AnswerRowsOptions group2Elem1 = new AnswerRowsOptions( ImmutableSet.of("b"), ImmutableList.of(new ColumnFilter("a", "1")), false); AnswerRowsOptions group3Elem1 = new AnswerRowsOptions( ImmutableSet.of("a"), ImmutableList.of(new ColumnFilter("a", "2")), false); AnswerRowsOptions group4Elem1 = new AnswerRowsOptions( ImmutableSet.of("a"), ImmutableList.of(new ColumnFilter("a", "1")),
Map<String, String> rawAnswers = ImmutableMap.of(questionName, answerStr); AnswerRowsOptions options = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(),
@Test public void testProcessAnswerRows2() throws IOException { String columnName = "issue"; int maxRows = 1; int rowOffset = 0; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.ISSUE, "foobar")))); table.addRow(Row.of(columnName, new Issue("blah", 5, new Issue.Type("m", "n")))); Answer answer = new Answer(); answer.addAnswerElement(table); answer.setStatus(AnswerStatus.SUCCESS); String answerStr = BatfishObjectMapper.writePrettyString(answer); AnswerRowsOptions options = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(), maxRows, rowOffset, ImmutableList.of(new ColumnSortOption(columnName, true)), false); List<Row> processedRows = ((TableView) _manager.processAnswerRows2(answerStr, options).getAnswerElements().get(0)) .getInnerRows(); assertThat(processedRows, equalTo(table.getRowsList())); }
@Test public void testProcessAnswerRows() throws IOException { String columnName = "issue"; int maxRows = 1; int rowOffset = 0; TableAnswerElement table = new TableAnswerElement( new TableMetadata( ImmutableList.of(new ColumnMetadata(columnName, Schema.ISSUE, "foobar")))); table.addRow(Row.of(columnName, new Issue("blah", 5, new Issue.Type("m", "n")))); Answer answer = new Answer(); answer.addAnswerElement(table); answer.setStatus(AnswerStatus.SUCCESS); String answerStr = BatfishObjectMapper.writePrettyString(answer); AnswerRowsOptions options = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(), maxRows, rowOffset, ImmutableList.of(new ColumnSortOption(columnName, true)), false); List<Row> processedRows = ((TableAnswerElement) _manager.processAnswerRows(answerStr, options).getAnswerElements().get(0)) .getRowsList(); assertThat(processedRows, equalTo(table.getRowsList())); }
ImmutableMap.of( questionName, new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(new ColumnFilter(columnName, "")),
String columnName = "col"; AnswerRowsOptions answersRowsOptions = new AnswerRowsOptions( ImmutableSet.of(columnName), ImmutableList.of(new ColumnFilter(columnName, "")),