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));
+ }
}