You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by tw...@apache.org on 2017/01/20 15:05:25 UTC

flink git commit: [FLINK-5549] [core] TypeExtractor fails with RuntimeException, but should use GenericTypeInfo

Repository: flink
Updated Branches:
  refs/heads/master 6bf556e60 -> 2703d339a


[FLINK-5549] [core] TypeExtractor fails with RuntimeException, but should use GenericTypeInfo

This closes #3154.


Project: http://git-wip-us.apache.org/repos/asf/flink/repo
Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/2703d339
Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/2703d339
Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/2703d339

Branch: refs/heads/master
Commit: 2703d339abafdd9f39bc35faa1eed718501f71a7
Parents: 6bf556e
Author: twalthr <tw...@apache.org>
Authored: Wed Jan 18 14:43:32 2017 +0100
Committer: twalthr <tw...@apache.org>
Committed: Fri Jan 20 16:04:57 2017 +0100

----------------------------------------------------------------------
 .../flink/api/java/typeutils/TypeExtractor.java | 21 ++++++++++++++------
 .../java/typeutils/PojoTypeExtractionTest.java  |  5 +++--
 2 files changed, 18 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flink/blob/2703d339/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java
----------------------------------------------------------------------
diff --git a/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java b/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java
index 8bf2867..a2664f9 100644
--- a/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java
+++ b/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java
@@ -893,7 +893,7 @@ public class TypeExtractor {
 			// build the entire type hierarchy for the pojo
 			getTypeHierarchy(inputTypeHierarchy, inType, Object.class);
 			// determine a field containing the type variable
-			List<Field> fields = getAllDeclaredFields(typeToClass(inType));
+			List<Field> fields = getAllDeclaredFields(typeToClass(inType), false);
 			for (Field field : fields) {
 				Type fieldType = field.getGenericType();
 				if (fieldType instanceof TypeVariable && sameTypeVars(returnTypeVar, materializeTypeVariable(inputTypeHierarchy, (TypeVariable<?>) fieldType))) {
@@ -1738,7 +1738,7 @@ public class TypeExtractor {
 			getTypeHierarchy(typeHierarchy, clazz, Object.class);
 		}
 		
-		List<Field> fields = getAllDeclaredFields(clazz);
+		List<Field> fields = getAllDeclaredFields(clazz, false);
 		if (fields.size() == 0) {
 			LOG.info("No fields detected for " + clazz + ". Cannot be used as a PojoType. Will be handled as GenericType");
 			return new GenericTypeInfo<OUT>(clazz);
@@ -1803,12 +1803,17 @@ public class TypeExtractor {
 	}
 
 	/**
-	 * recursively determine all declared fields
+	 * Recursively determine all declared fields
 	 * This is required because class.getFields() is not returning fields defined
 	 * in parent classes.
+	 *
+	 * @param clazz class to be analyzed
+	 * @param ignoreDuplicates if true, in case of duplicate field names only the lowest one
+	 *                            in a hierarchy will be returned; throws an exception otherwise
+	 * @return list of fields
 	 */
 	@PublicEvolving
-	public static List<Field> getAllDeclaredFields(Class<?> clazz) {
+	public static List<Field> getAllDeclaredFields(Class<?> clazz, boolean ignoreDuplicates) {
 		List<Field> result = new ArrayList<Field>();
 		while (clazz != null) {
 			Field[] fields = clazz.getDeclaredFields();
@@ -1817,8 +1822,12 @@ public class TypeExtractor {
 					continue; // we have no use for transient or static fields
 				}
 				if(hasFieldWithSameName(field.getName(), result)) {
-					throw new RuntimeException("The field "+field+" is already contained in the hierarchy of the "+clazz+"."
+					if (ignoreDuplicates) {
+						continue;
+					} else {
+						throw new InvalidTypesException("The field "+field+" is already contained in the hierarchy of the "+clazz+"."
 							+ "Please use unique field names through your classes hierarchy");
+					}
 				}
 				result.add(field);
 			}
@@ -1829,7 +1838,7 @@ public class TypeExtractor {
 
 	@PublicEvolving
 	public static Field getDeclaredField(Class<?> clazz, String name) {
-		for (Field field : getAllDeclaredFields(clazz)) {
+		for (Field field : getAllDeclaredFields(clazz, true)) {
 			if (field.getName().equals(name)) {
 				return field;
 			}

http://git-wip-us.apache.org/repos/asf/flink/blob/2703d339/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java
----------------------------------------------------------------------
diff --git a/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java b/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java
index 2ca5081..ba09786 100644
--- a/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java
+++ b/flink-core/src/test/java/org/apache/flink/api/java/typeutils/PojoTypeExtractionTest.java
@@ -52,9 +52,10 @@ public class PojoTypeExtractionTest {
 		private int count; // duplicate
 	}
 
-	@Test(expected=RuntimeException.class)
+	@Test
 	public void testDuplicateFieldException() {
-		TypeExtractor.createTypeInfo(HasDuplicateField.class);
+		TypeInformation<?> ti = TypeExtractor.createTypeInfo(HasDuplicateField.class);
+		Assert.assertTrue(ti instanceof GenericTypeInfo<?>);
 	}
 
 	// test with correct pojo types