/** Rerieve the function that converts an object of the specified type to a {@link Row} object. */ public <T> SerializableFunction<T, Row> getToRowFunction(Class<T> clazz) throws NoSuchSchemaException { return getToRowFunction(TypeDescriptor.of(clazz)); }
@Test public void testNestedNullValuesGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); Row row = registry .getToRowFunction(POJOWithNestedNullable.class) .apply(new POJOWithNestedNullable(null)); assertNull(row.getValue("nested")); }
@Test public void testFromRowWithGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SimplePOJO pojo = createSimple("string"); Row row = registry.getToRowFunction(SimplePOJO.class).apply(pojo); // Test that the fromRowFunction simply returns the original object back. SimplePOJO extracted = registry.getFromRowFunction(SimplePOJO.class).apply(row); assertSame(pojo, extracted); }
@Test public void testFromRowWithGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SimpleBean bean = createSimple("string"); Row row = registry.getToRowFunction(SimpleBean.class).apply(bean); // Test that the fromRowFunction simply returns the original object back. SimpleBean extracted = registry.getFromRowFunction(SimpleBean.class).apply(row); assertSame(bean, extracted); }
@Test public void testNullValuesGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); Row row = registry.getToRowFunction(POJOWithNullables.class).apply(new POJOWithNullables(null, 42)); assertNull(row.getString("str")); assertEquals(42, (Object) row.getInt32("anInt")); }
@Test public void testMapFieldGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( NESTED_MAP_BEAN_SCHEMA, registry.getSchema(NestedMapBean.class)); SimpleBean simple1 = createSimple("string1"); SimpleBean simple2 = createSimple("string2"); SimpleBean simple3 = createSimple("string3"); NestedMapBean bean = new NestedMapBean( ImmutableMap.of( "simple1", simple1, "simple2", simple2, "simple3", simple3)); Row row = registry.getToRowFunction(NestedMapBean.class).apply(bean); Map<String, Row> extractedMap = row.getMap("map"); assertEquals(3, extractedMap.size()); assertEquals("string1", extractedMap.get("simple1").getString("str")); assertEquals("string2", extractedMap.get("simple2").getString("str")); assertEquals("string3", extractedMap.get("simple3").getString("str")); }
@Test public void testMapFieldGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( NESTED_MAP_POJO_SCHEMA, registry.getSchema(NestedMapPOJO.class)); SimplePOJO simple1 = createSimple("string1"); SimplePOJO simple2 = createSimple("string2"); SimplePOJO simple3 = createSimple("string3"); NestedMapPOJO pojo = new NestedMapPOJO( ImmutableMap.of( "simple1", simple1, "simple2", simple2, "simple3", simple3)); Row row = registry.getToRowFunction(NestedMapPOJO.class).apply(pojo); Map<String, Row> extractedMap = row.getMap("map"); assertEquals(3, extractedMap.size()); assertEquals("string1", extractedMap.get("simple1").getString("str")); assertEquals("string2", extractedMap.get("simple2").getString("str")); assertEquals("string3", extractedMap.get("simple3").getString("str")); }
@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 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))); }
private void tryGetters(SchemaRegistry registry) throws NoSuchSchemaException { assertEquals(STRING_SCHEMA, registry.getSchema(String.class)); assertEquals(STRING_SCHEMA, registry.getSchema(TypeDescriptors.strings())); assertEquals( Row.withSchema(STRING_SCHEMA).addValue("foobar").build(), registry.getToRowFunction(String.class).apply("foobar")); assertEquals( Row.withSchema(STRING_SCHEMA).addValue("foobar").build(), registry.getToRowFunction(TypeDescriptors.strings()).apply("foobar")); assertEquals(INTEGER_SCHEMA, registry.getSchema(Integer.class)); assertEquals(INTEGER_SCHEMA, registry.getSchema(TypeDescriptors.integers())); assertEquals( Row.withSchema(INTEGER_SCHEMA).addValue(42).build(), registry.getToRowFunction(Integer.class).apply(42)); assertEquals( Row.withSchema(INTEGER_SCHEMA).addValue(42).build(), registry.getToRowFunction(TypeDescriptors.integers()).apply(42)); thrown.expect(NoSuchSchemaException.class); registry.getSchema(Double.class); }
SchemaCoder.of( schemaRegistry.getSchema(typeDescriptor.get()), schemaRegistry.getToRowFunction(typeDescriptor.get()), schemaRegistry.getFromRowFunction(typeDescriptor.get())); } catch (NoSuchSchemaException e) {
@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")); }
@Override public PCollection<OutputT> expand(PCollection<? extends InputT> input) { SchemaRegistry schemaRegistry = input.getPipeline().getSchemaRegistry(); CoderRegistry registry = input.getPipeline().getCoderRegistry(); finishSpecifyingStateSpecs(fn, registry, input.getCoder()); TupleTag<OutputT> mainOutput = new TupleTag<>(MAIN_OUTPUT_TAG); PCollection<OutputT> res = input.apply(withOutputTags(mainOutput, TupleTagList.empty())).get(mainOutput); try { res.setSchema( schemaRegistry.getSchema(getFn().getOutputTypeDescriptor()), schemaRegistry.getToRowFunction(getFn().getOutputTypeDescriptor()), schemaRegistry.getFromRowFunction(getFn().getOutputTypeDescriptor())); } catch (NoSuchSchemaException e) { try { res.setCoder( registry.getCoder( getFn().getOutputTypeDescriptor(), getFn().getInputTypeDescriptor(), ((PCollection<InputT>) input).getCoder())); } catch (CannotProvideCoderException e2) { // Ignore and leave coder unset. } } return res; }
@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 testToRow() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SimplePOJO pojo = createSimple("string"); Row row = registry.getToRowFunction(SimplePOJO.class).apply(pojo); assertEquals(12, row.getFieldCount()); assertEquals("string", row.getString("str")); assertEquals((byte) 1, (Object) row.getByte("aByte")); assertEquals((short) 2, (Object) row.getInt16("aShort")); assertEquals((int) 3, (Object) row.getInt32("anInt")); assertEquals((long) 4, (Object) row.getInt64("aLong")); assertEquals(true, row.getBoolean("aBoolean")); assertEquals(DATE.toInstant(), row.getDateTime("dateTime")); assertEquals(INSTANT, row.getDateTime("instant").toInstant()); assertArrayEquals(BYTE_ARRAY, row.getBytes("bytes")); assertArrayEquals(BYTE_BUFFER.array(), row.getBytes("byteBuffer")); assertEquals(BigDecimal.ONE, row.getDecimal("bigDecimal")); assertEquals("stringbuilder", row.getString("stringBuilder")); }
@Test public void testRecursiveGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( NESTED_POJO_SCHEMA, registry.getSchema(NestedPOJO.class)); NestedPOJO pojo = new NestedPOJO(createSimple("string")); Row row = registry.getToRowFunction(NestedPOJO.class).apply(pojo); Row nestedRow = row.getRow("nested"); assertEquals("string", nestedRow.getString("str")); assertEquals((byte) 1, (Object) nestedRow.getByte("aByte")); assertEquals((short) 2, (Object) nestedRow.getInt16("aShort")); assertEquals((int) 3, (Object) nestedRow.getInt32("anInt")); assertEquals((long) 4, (Object) nestedRow.getInt64("aLong")); assertEquals(true, nestedRow.getBoolean("aBoolean")); assertEquals(DATE.toInstant(), nestedRow.getDateTime("dateTime")); assertEquals(INSTANT, nestedRow.getDateTime("instant").toInstant()); assertArrayEquals("not equal", BYTE_ARRAY, nestedRow.getBytes("bytes")); assertArrayEquals("not equal", BYTE_BUFFER.array(), nestedRow.getBytes("byteBuffer")); assertEquals(BigDecimal.ONE, nestedRow.getDecimal("bigDecimal")); assertEquals("stringbuilder", nestedRow.getString("stringBuilder")); }
@Test public void testToRow() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SimpleBean bean = createSimple("string"); Row row = registry.getToRowFunction(SimpleBean.class).apply(bean); assertEquals(12, row.getFieldCount()); assertEquals("string", row.getString("str")); assertEquals((byte) 1, (Object) row.getByte("aByte")); assertEquals((short) 2, (Object) row.getInt16("aShort")); assertEquals((int) 3, (Object) row.getInt32("anInt")); assertEquals((long) 4, (Object) row.getInt64("aLong")); assertEquals(true, (Object) row.getBoolean("aBoolean")); assertEquals(DATE.toInstant(), row.getDateTime("dateTime")); assertEquals(DATE.toInstant(), row.getDateTime("instant")); assertArrayEquals(BYTE_ARRAY, row.getBytes("bytes")); assertArrayEquals(BYTE_ARRAY, row.getBytes("byteBuffer")); assertEquals(BigDecimal.ONE, row.getDecimal("bigDecimal")); assertEquals("stringbuilder", row.getString("stringBuilder")); }
@Test public void testRecursiveGetters() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); SchemaTestUtils.assertSchemaEquivalent( NESTED_BEAN_SCHEMA, registry.getSchema(NestedBean.class)); NestedBean bean = new NestedBean(createSimple("string")); Row row = registry.getToRowFunction(NestedBean.class).apply(bean); Row nestedRow = row.getRow("nested"); assertEquals("string", nestedRow.getString("str")); assertEquals((byte) 1, (Object) nestedRow.getByte("aByte")); assertEquals((short) 2, (Object) nestedRow.getInt16("aShort")); assertEquals((int) 3, (Object) nestedRow.getInt32("anInt")); assertEquals((long) 4, (Object) nestedRow.getInt64("aLong")); assertEquals(true, nestedRow.getBoolean("aBoolean")); assertEquals(DATE.toInstant(), nestedRow.getDateTime("dateTime")); assertEquals(DATE.toInstant(), nestedRow.getDateTime("instant")); assertArrayEquals("not equal", BYTE_ARRAY, nestedRow.getBytes("bytes")); assertArrayEquals("not equal", BYTE_ARRAY, nestedRow.getBytes("byteBuffer")); assertEquals(BigDecimal.ONE, nestedRow.getDecimal("bigDecimal")); assertEquals("stringbuilder", nestedRow.getString("stringBuilder")); }