[ https://issues.apache.org/jira/browse/FLINK-3042?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15424257#comment-15424257 ]
ASF GitHub Bot commented on FLINK-3042: --------------------------------------- Github user StephanEwen commented on a diff in the pull request: https://github.com/apache/flink/pull/2337#discussion_r75097127 --- Diff: flink-core/src/test/java/org/apache/flink/api/java/typeutils/TypeInfoFactoryTest.java --- @@ -0,0 +1,482 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.flink.api.java.typeutils; + +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; +import org.apache.flink.api.common.ExecutionConfig; +import org.apache.flink.api.common.functions.InvalidTypesException; +import org.apache.flink.api.common.functions.MapFunction; +import static org.apache.flink.api.common.typeinfo.BasicTypeInfo.BOOLEAN_TYPE_INFO; +import static org.apache.flink.api.common.typeinfo.BasicTypeInfo.DOUBLE_TYPE_INFO; +import static org.apache.flink.api.common.typeinfo.BasicTypeInfo.FLOAT_TYPE_INFO; +import static org.apache.flink.api.common.typeinfo.BasicTypeInfo.INT_TYPE_INFO; +import static org.apache.flink.api.common.typeinfo.BasicTypeInfo.STRING_TYPE_INFO; +import org.apache.flink.api.common.typeinfo.TypeInfo; +import org.apache.flink.api.common.typeinfo.TypeInfoFactory; +import org.apache.flink.api.common.typeinfo.TypeInformation; +import org.apache.flink.api.common.typeutils.TypeSerializer; +import org.apache.flink.api.java.tuple.Tuple1; +import org.apache.flink.api.java.tuple.Tuple2; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +/** + * Tests for extracting {@link org.apache.flink.api.common.typeinfo.TypeInformation} from types + * using a {@link org.apache.flink.api.common.typeinfo.TypeInfoFactory} + */ +@SuppressWarnings({"unchecked", "rawtypes"}) +public class TypeInfoFactoryTest { + + @Test + public void testSimpleType() { + TypeInformation ti = TypeExtractor.createTypeInfo(IntLike.class); + assertEquals(INT_TYPE_INFO, ti); + + ti = TypeExtractor.getForClass(IntLike.class); + assertEquals(INT_TYPE_INFO, ti); + + ti = TypeExtractor.getForObject(new IntLike()); + assertEquals(INT_TYPE_INFO, ti); + } + + @Test + public void testMyEitherGenericType() { + MapFunction f = new MyEitherMapper(); + TypeInformation ti = TypeExtractor.getMapReturnTypes(f, (TypeInformation) BOOLEAN_TYPE_INFO); + assertTrue(ti instanceof EitherTypeInfo); + EitherTypeInfo eti = (EitherTypeInfo) ti; + assertEquals(BOOLEAN_TYPE_INFO, eti.getLeftType()); + assertEquals(STRING_TYPE_INFO, eti.getRightType()); + } + + @Test + public void testMyOptionGenericType() { + TypeInformation inTypeInfo = new MyOptionTypeInfo(new TupleTypeInfo(BOOLEAN_TYPE_INFO, STRING_TYPE_INFO)); + MapFunction f = new MyOptionMapper(); + TypeInformation ti = TypeExtractor.getMapReturnTypes(f, inTypeInfo); + assertTrue(ti instanceof MyOptionTypeInfo); + MyOptionTypeInfo oti = (MyOptionTypeInfo) ti; + assertTrue(oti.getInnerType() instanceof TupleTypeInfo); + TupleTypeInfo tti = (TupleTypeInfo) oti.getInnerType(); + assertEquals(BOOLEAN_TYPE_INFO, tti.getTypeAt(0)); + assertEquals(BOOLEAN_TYPE_INFO, tti.getTypeAt(1)); + } + + @Test + public void testMyTuple2() { + TypeInformation inTypeInfo = new TupleTypeInfo(new MyTupleTypeInfo(DOUBLE_TYPE_INFO, STRING_TYPE_INFO)); + MapFunction f = new MyTupleMapperL2(); + TypeInformation ti = TypeExtractor.getMapReturnTypes(f, inTypeInfo); + assertTrue(ti instanceof TupleTypeInfo); + TupleTypeInfo tti = (TupleTypeInfo) ti; + assertTrue(tti.getTypeAt(0) instanceof MyTupleTypeInfo); + MyTupleTypeInfo mtti = (MyTupleTypeInfo) tti.getTypeAt(0); + assertEquals(BOOLEAN_TYPE_INFO, mtti.getField0()); + assertEquals(DOUBLE_TYPE_INFO, mtti.getField1()); + } + + @Test + public void testMyTupleHierarchy() { + TypeInformation ti = TypeExtractor.createTypeInfo(MyTuple2.class); + assertTrue(ti instanceof MyTupleTypeInfo); + MyTupleTypeInfo mtti = (MyTupleTypeInfo) ti; + assertEquals(STRING_TYPE_INFO, mtti.getField0()); + assertEquals(BOOLEAN_TYPE_INFO, mtti.getField1()); + } + + @Test + public void testMyTupleHierarchyWithInference() { + TypeInformation inTypeInfo = new TupleTypeInfo(new MyTupleTypeInfo(new TupleTypeInfo(FLOAT_TYPE_INFO), BOOLEAN_TYPE_INFO)); + MapFunction f = new MyTuple3Mapper(); + TypeInformation ti = TypeExtractor.getMapReturnTypes(f, inTypeInfo); + assertTrue(ti instanceof TupleTypeInfo); + TupleTypeInfo tti = (TupleTypeInfo) ti; + assertTrue(tti.getTypeAt(0) instanceof MyTupleTypeInfo); + MyTupleTypeInfo mtti = (MyTupleTypeInfo) tti.getTypeAt(0); + assertEquals(new TupleTypeInfo(FLOAT_TYPE_INFO, STRING_TYPE_INFO), mtti.getField0()); + assertEquals(BOOLEAN_TYPE_INFO, mtti.getField1()); + } + + @Test(expected = InvalidTypesException.class) + public void testMissingTypeInfo() { + MapFunction f = new MyFaultyMapper(); + TypeExtractor.getMapReturnTypes(f, INT_TYPE_INFO); + } + + @Test(expected = InvalidTypesException.class) + public void testMissingTypeInference() { + MapFunction f = new MyFaultyMapper2(); + TypeExtractor.getMapReturnTypes(f, new MyFaultyTypeInfo()); + } + + // global registration of factories is currently private + /* --- End diff -- Old code, should this be removed? > Define a way to let types create their own TypeInformation > ---------------------------------------------------------- > > Key: FLINK-3042 > URL: https://issues.apache.org/jira/browse/FLINK-3042 > Project: Flink > Issue Type: Improvement > Components: Core > Affects Versions: 0.10.0 > Reporter: Stephan Ewen > Assignee: Timo Walther > Fix For: 1.0.0 > > > Currently, introducing new Types that should have specific TypeInformation > requires > - Either integration with the TypeExtractor > - Or manually constructing the TypeInformation (potentially at every place) > and using type hints everywhere. > I propose to add a way to allow classes to create their own TypeInformation > (like a static method "createTypeInfo()"). > To support generic nested types (like Optional / Either), the type extractor > would provide a Map of what generic variables map to what types (deduced from > the input). The class can use that to create the correct nested > TypeInformation (possibly by calling the TypeExtractor again, passing the Map > of generic bindings). -- This message was sent by Atlassian JIRA (v6.3.4#6332)