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

Reply via email to