You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@crunch.apache.org by gr...@apache.org on 2012/08/12 21:55:47 UTC

git commit: [CRUNCH-44] - Fix deep copy of Avro map

Updated Branches:
  refs/heads/master 0666b0f89 -> 38d7b3a6b


[CRUNCH-44] - Fix deep copy of Avro map


Project: http://git-wip-us.apache.org/repos/asf/incubator-crunch/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-crunch/commit/38d7b3a6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-crunch/tree/38d7b3a6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-crunch/diff/38d7b3a6

Branch: refs/heads/master
Commit: 38d7b3a6b301a09d06c90d2e449c9197fae9b481
Parents: 0666b0f
Author: Gabriel Reid <ga...@gmail.com>
Authored: Sun Aug 12 21:06:37 2012 +0200
Committer: Gabriel Reid <ga...@gmail.com>
Committed: Sun Aug 12 21:51:13 2012 +0200

----------------------------------------------------------------------
 .../org/apache/crunch/types/MapDeepCopier.java     |   44 ++++++++++++++
 .../org/apache/crunch/types/avro/AvroType.java     |    4 +
 .../org/apache/crunch/types/MapDeepCopierTest.java |   47 +++++++++++++++
 .../org/apache/crunch/types/avro/AvroTypeTest.java |   18 ++++++
 4 files changed, 113 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/38d7b3a6/crunch/src/main/java/org/apache/crunch/types/MapDeepCopier.java
----------------------------------------------------------------------
diff --git a/crunch/src/main/java/org/apache/crunch/types/MapDeepCopier.java b/crunch/src/main/java/org/apache/crunch/types/MapDeepCopier.java
new file mode 100644
index 0000000..b1e4b37
--- /dev/null
+++ b/crunch/src/main/java/org/apache/crunch/types/MapDeepCopier.java
@@ -0,0 +1,44 @@
+/**
+ * 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.crunch.types;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.google.common.collect.Maps;
+
+
+public class MapDeepCopier<T> implements DeepCopier<Map<String,T>> {
+
+  private final PType<T> ptype;
+  
+  public MapDeepCopier(PType<T> ptype){
+    this.ptype = ptype;
+  }
+  
+  @Override
+  public Map<String, T> deepCopy(Map<String, T> source) {
+    Map<String,T> deepCopyMap = Maps.newHashMap();
+    for (Entry<String, T> entry : source.entrySet()){
+      deepCopyMap.put(entry.getKey(), ptype.getDetachedValue(entry.getValue()));
+    }
+    return deepCopyMap;
+    
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/38d7b3a6/crunch/src/main/java/org/apache/crunch/types/avro/AvroType.java
----------------------------------------------------------------------
diff --git a/crunch/src/main/java/org/apache/crunch/types/avro/AvroType.java b/crunch/src/main/java/org/apache/crunch/types/avro/AvroType.java
index 8d7fbd5..82c4c91 100644
--- a/crunch/src/main/java/org/apache/crunch/types/avro/AvroType.java
+++ b/crunch/src/main/java/org/apache/crunch/types/avro/AvroType.java
@@ -19,6 +19,7 @@ package org.apache.crunch.types.avro;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.avro.Schema;
 import org.apache.avro.generic.GenericData;
@@ -32,6 +33,7 @@ import org.apache.crunch.io.avro.AvroFileSourceTarget;
 import org.apache.crunch.types.CollectionDeepCopier;
 import org.apache.crunch.types.Converter;
 import org.apache.crunch.types.DeepCopier;
+import org.apache.crunch.types.MapDeepCopier;
 import org.apache.crunch.types.PType;
 import org.apache.crunch.types.PTypeFamily;
 import org.apache.crunch.types.TupleDeepCopier;
@@ -157,6 +159,8 @@ public class AvroType<T> implements PType<T> {
     if (deepCopier == null) {
       if (Tuple.class.isAssignableFrom(this.typeClass)) {
         deepCopier = new TupleDeepCopier(this);
+      } else if (Map.class.isAssignableFrom(this.typeClass)){
+        deepCopier = new MapDeepCopier(this.subTypes.get(0));
       } else if (Collection.class.isAssignableFrom(this.typeClass)){
         deepCopier = new CollectionDeepCopier(this.subTypes.get(0));
       } else if (isSpecific()) {

http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/38d7b3a6/crunch/src/test/java/org/apache/crunch/types/MapDeepCopierTest.java
----------------------------------------------------------------------
diff --git a/crunch/src/test/java/org/apache/crunch/types/MapDeepCopierTest.java b/crunch/src/test/java/org/apache/crunch/types/MapDeepCopierTest.java
new file mode 100644
index 0000000..f351691
--- /dev/null
+++ b/crunch/src/test/java/org/apache/crunch/types/MapDeepCopierTest.java
@@ -0,0 +1,47 @@
+/**
+ * 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.crunch.types;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+
+import java.util.Map;
+
+import org.apache.crunch.test.StringWrapper;
+import org.apache.crunch.types.avro.Avros;
+import org.junit.Test;
+
+import com.google.common.collect.Maps;
+
+public class MapDeepCopierTest {
+
+  @Test
+  public void testDeepCopy() {
+    StringWrapper stringWrapper = new StringWrapper("value");
+    String key = "key";
+    Map<String, StringWrapper> map = Maps.newHashMap();
+    map.put(key, stringWrapper);
+
+    MapDeepCopier<StringWrapper> deepCopier = new MapDeepCopier<StringWrapper>(Avros.reflects(StringWrapper.class));
+    Map<String, StringWrapper> deepCopy = deepCopier.deepCopy(map);
+
+    assertEquals(map, deepCopy);
+    assertNotSame(map.get(key), deepCopy.get(key));
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/38d7b3a6/crunch/src/test/java/org/apache/crunch/types/avro/AvroTypeTest.java
----------------------------------------------------------------------
diff --git a/crunch/src/test/java/org/apache/crunch/types/avro/AvroTypeTest.java b/crunch/src/test/java/org/apache/crunch/types/avro/AvroTypeTest.java
index 486bd1a..092b89e 100644
--- a/crunch/src/test/java/org/apache/crunch/types/avro/AvroTypeTest.java
+++ b/crunch/src/test/java/org/apache/crunch/types/avro/AvroTypeTest.java
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.avro.generic.GenericData;
 import org.apache.avro.generic.GenericData.Record;
@@ -34,6 +35,7 @@ import org.apache.crunch.test.StringWrapper;
 import org.junit.Test;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 public class AvroTypeTest {
 
@@ -210,5 +212,21 @@ public class AvroTypeTest {
     
     assertNotSame(person, detachedPerson);
   }
+  
+  @Test
+  public void testGetDetachedValue_Map(){
+    String key = "key";
+    Person value = createPerson();
+    
+    Map<String,Person> stringPersonMap = Maps.newHashMap();
+    stringPersonMap.put(key, value);
+    
+    AvroType<Map<String, Person>> mapType = Avros.maps(Avros.records(Person.class));
+    
+    Map<String, Person> detachedMap = mapType.getDetachedValue(stringPersonMap);
+    
+    assertEquals(stringPersonMap, detachedMap);
+    assertNotSame(value, detachedMap.get(key));
+  }
 
 }