/** * Get an array value by field name, {@link IllegalStateException} is thrown if schema doesn't * match. */ @Nullable public <T> List<T> getArray(String fieldName) { return getArray(getSchema().indexOf(fieldName)); }
@Override public boolean matches(Object item) { if (!(item instanceof Row)) { return false; } Row row = (Row) item; List<Row> actual = row.getArray(fieldIndex); return containsInAnyOrder(expected).matches(actual); }
@ProcessElement public void process(@Element Row inputRow, OutputReceiver<Row> output) { for (Object element : inputRow.getArray(0)) { output.output(Row.withSchema(schema).addValue(element).build()); } } }
@ProcessElement public void process(@Element Row row, OutputReceiver<Row> out) { @Nullable List<Object> rawValues = row.getArray(unnestIndex); if (rawValues == null) { return; } for (Object uncollectedValue : rawValues) { out.output( Row.withSchema(outputSchema) .addValues(row.getValues()) .addValue(uncollectedValue) .build()); } } }
@Test public void testPrimitiveArrayGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( PRIMITIVE_ARRAY_BEAN_SCHEMA, registry.getSchema(PrimitiveArrayBean.class)); List<String> strList = ImmutableList.of("a", "b", "c"); int[] intArray = {1, 2, 3, 4}; Long[] longArray = {42L, 43L, 44L}; PrimitiveArrayBean bean = new PrimitiveArrayBean(strList, intArray, longArray); Row row = registry.getToRowFunction(PrimitiveArrayBean.class).apply(bean); assertEquals(strList, row.getArray("strings")); assertEquals(Ints.asList(intArray), row.getArray("integers")); assertEquals(Arrays.asList(longArray), row.getArray("longs")); // Ensure that list caching works. assertSame(row.getArray("strings"), row.getArray("strings")); assertSame(row.getArray("integers"), row.getArray("integers")); assertSame(row.getArray("longs"), row.getArray("longs")); }
@Test public void testPrimitiveArrayGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( PRIMITIVE_ARRAY_POJO_SCHEMA, registry.getSchema(PrimitiveArrayPOJO.class)); List<String> strList = ImmutableList.of("a", "b", "c"); int[] intArray = {1, 2, 3, 4}; Long[] longArray = {42L, 43L, 44L}; PrimitiveArrayPOJO pojo = new PrimitiveArrayPOJO(strList, intArray, longArray); Row row = registry.getToRowFunction(PrimitiveArrayPOJO.class).apply(pojo); assertEquals(strList, row.getArray("strings")); assertEquals(Ints.asList(intArray), row.getArray("integers")); assertEquals(Arrays.asList(longArray), row.getArray("longs")); // Ensure that list caching works. assertSame(row.getArray("strings"), row.getArray("strings")); assertSame(row.getArray("integers"), row.getArray("integers")); assertSame(row.getArray("longs"), row.getArray("longs")); }
@Test public void testPrimitiveArraySetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); Row row = Row.withSchema(PRIMITIVE_ARRAY_POJO_SCHEMA) .addArray("a", "b", "c", "d") .addArray(1, 2, 3, 4) .addArray(42L, 43L, 44L, 45L) .build(); PrimitiveArrayPOJO pojo = registry.getFromRowFunction(PrimitiveArrayPOJO.class).apply(row); assertEquals(row.getArray("strings"), pojo.strings); assertEquals(row.getArray("integers"), Ints.asList(pojo.integers)); assertEquals(row.getArray("longs"), Arrays.asList(pojo.longs)); }
@Test public void testCreatesArray() { List<Integer> data = Lists.newArrayList(2, 3, 5, 7); Schema type = Stream.of(Schema.Field.of("array", Schema.FieldType.array(Schema.FieldType.INT32))) .collect(toSchema()); Row row = Row.withSchema(type).addArray(data).build(); assertEquals(data, row.getArray("array")); }
@Test public void testCreatesArrayWithNullElement() { List<Integer> data = Lists.newArrayList(2, null, 5, null); Schema type = Stream.of(Schema.Field.of("array", Schema.FieldType.array(Schema.FieldType.INT32, true))) .collect(toSchema()); Row row = Row.withSchema(type).addArray(data).build(); assertEquals(data, row.getArray("array")); }
private static Void containsJoinedFields( List<KV<Row, Row>> expected, Iterable<KV<Row, Row>> actual) { List<Matcher<? super KV<Row, Row>>> matchers = Lists.newArrayList(); for (KV<Row, Row> row : expected) { List<Matcher> fieldMatchers = Lists.newArrayList(); Row value = row.getValue(); Schema valueSchema = value.getSchema(); for (int i = 0; i < valueSchema.getFieldCount(); ++i) { assertEquals(TypeName.ARRAY, valueSchema.getField(i).getType().getTypeName()); fieldMatchers.add(new ArrayFieldMatchesAnyOrder(i, value.getArray(i))); } matchers.add( KvMatcher.isKv(equalTo(row.getKey()), allOf(fieldMatchers.toArray(new Matcher[0])))); } assertThat(actual, containsInAnyOrder(matchers.toArray(new Matcher[0]))); return null; }
@Test public void testPrimitiveArraySetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); Row row = Row.withSchema(PRIMITIVE_ARRAY_BEAN_SCHEMA) .addArray("a", "b", "c", "d") .addArray(1, 2, 3, 4) .addArray(42L, 43L, 44L, 45L) .build(); PrimitiveArrayBean bean = registry.getFromRowFunction(PrimitiveArrayBean.class).apply(row); assertEquals(row.getArray("strings"), bean.getStrings()); assertEquals(row.getArray("integers"), Ints.asList(bean.getIntegers())); assertEquals(row.getArray("longs"), Arrays.asList(bean.getLongs())); }
@Test public void testCreatesArrayArrayWithNullElement() { List<List<Integer>> data = Lists.<List<Integer>>newArrayList(Lists.newArrayList(1, null, 3, null), null); Schema type = Stream.of( Schema.Field.of( "array", FieldType.array(FieldType.array(FieldType.INT32, true), true))) .collect(toSchema()); Row row = Row.withSchema(type).addArray(data).build(); assertEquals(data, row.getArray("array")); }
@Test public void testCreatesArrayArray() { List<List<Integer>> data = Lists.<List<Integer>>newArrayList(Lists.newArrayList(1, 2, 3, 4)); Schema type = Stream.of(Schema.Field.of("array", FieldType.array(FieldType.array(FieldType.INT32)))) .collect(toSchema()); Row row = Row.withSchema(type).addArray(data).build(); assertEquals(data, row.getArray("array")); }
@Test public void testCreatesRowArray() { Schema nestedType = Stream.of(Schema.Field.of("f1_str", FieldType.STRING)).collect(toSchema()); List<Row> data = Lists.newArrayList( Row.withSchema(nestedType).addValues("one").build(), Row.withSchema(nestedType).addValues("two").build(), Row.withSchema(nestedType).addValues("three").build()); Schema type = Stream.of(Schema.Field.of("array", FieldType.array(FieldType.row(nestedType)))) .collect(toSchema()); Row row = Row.withSchema(type).addArray(data).build(); assertEquals(data, row.getArray("array")); }
@Test public void testCreatesArrayOfMap() { List<Map<Integer, String>> data = ImmutableList.<Map<Integer, String>>builder() .add(ImmutableMap.of(1, "value1")) .add(ImmutableMap.of(2, "value2")) .build(); Schema type = Stream.of( Schema.Field.of( "array", FieldType.array(FieldType.map(FieldType.INT32, FieldType.STRING)))) .collect(toSchema()); Row row = Row.withSchema(type).addArray(data).build(); assertEquals(data, row.getArray("array")); }
@Test public void testRecursiveArrayGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( NESTED_ARRAY_POJO_SCHEMA, registry.getSchema(NestedArrayPOJO.class)); SimplePOJO simple1 = createSimple("string1"); SimplePOJO simple2 = createSimple("string2"); SimplePOJO simple3 = createSimple("string3"); NestedArrayPOJO pojo = new NestedArrayPOJO(simple1, simple2, simple3); Row row = registry.getToRowFunction(NestedArrayPOJO.class).apply(pojo); List<Row> rows = row.getArray("pojos"); assertSame(simple1, registry.getFromRowFunction(NestedArrayPOJO.class).apply(rows.get(0))); assertSame(simple2, registry.getFromRowFunction(NestedArrayPOJO.class).apply(rows.get(1))); assertSame(simple3, registry.getFromRowFunction(NestedArrayPOJO.class).apply(rows.get(2))); }
@Test public void testRecursiveArrayGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( NESTED_ARRAY_BEAN_SCHEMA, registry.getSchema(NestedArrayBean.class)); SimpleBean simple1 = createSimple("string1"); SimpleBean simple2 = createSimple("string2"); SimpleBean simple3 = createSimple("string3"); NestedArrayBean bean = new NestedArrayBean(simple1, simple2, simple3); Row row = registry.getToRowFunction(NestedArrayBean.class).apply(bean); List<Row> rows = row.getArray("beans"); assertSame(simple1, registry.getFromRowFunction(NestedArrayBean.class).apply(rows.get(0))); assertSame(simple2, registry.getFromRowFunction(NestedArrayBean.class).apply(rows.get(1))); assertSame(simple3, registry.getFromRowFunction(NestedArrayBean.class).apply(rows.get(2))); }
@Test public void testNestedArraysGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( NESTED_ARRAYS_POJO_SCHEMA, registry.getSchema(NestedArraysPOJO.class)); List<List<String>> listOfLists = Lists.newArrayList( Lists.newArrayList("a", "b", "c"), Lists.newArrayList("d", "e", "f"), Lists.newArrayList("g", "h", "i")); NestedArraysPOJO pojo = new NestedArraysPOJO(listOfLists); Row row = registry.getToRowFunction(NestedArraysPOJO.class).apply(pojo); assertEquals(listOfLists, row.getArray("lists")); }
@Test public void testNestedArraysGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( NESTED_ARRAYS_BEAM_SCHEMA, registry.getSchema(NestedArraysBean.class)); List<List<String>> listOfLists = Lists.newArrayList( Lists.newArrayList("a", "b", "c"), Lists.newArrayList("d", "e", "f"), Lists.newArrayList("g", "h", "i")); NestedArraysBean bean = new NestedArraysBean(listOfLists); Row row = registry.getToRowFunction(NestedArraysBean.class).apply(bean); assertEquals(listOfLists, row.getArray("lists")); }