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 <[email protected]> Authored: Sun Aug 12 21:06:37 2012 +0200 Committer: Gabriel Reid <[email protected]> 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)); + } }
