[
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)