Updated Branches: refs/heads/master 7cc16e322 -> 568e91cb6
CRUNCH-65: Add support for enums to PTypes. Contributed by Rahul Sharma. Project: http://git-wip-us.apache.org/repos/asf/incubator-crunch/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-crunch/commit/568e91cb Tree: http://git-wip-us.apache.org/repos/asf/incubator-crunch/tree/568e91cb Diff: http://git-wip-us.apache.org/repos/asf/incubator-crunch/diff/568e91cb Branch: refs/heads/master Commit: 568e91cb6002a5e8d782e8ca9401f1515cb20ee6 Parents: 7cc16e3 Author: Josh Wills <[email protected]> Authored: Wed Sep 19 12:22:07 2012 -0700 Committer: Josh Wills <[email protected]> Committed: Wed Sep 19 12:22:07 2012 -0700 ---------------------------------------------------------------------- .../src/it/java/org/apache/crunch/EnumPairIT.java | 59 +++++++++++++++ .../main/java/org/apache/crunch/util/PTypes.java | 25 ++++++ 2 files changed, 84 insertions(+), 0 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/568e91cb/crunch/src/it/java/org/apache/crunch/EnumPairIT.java ---------------------------------------------------------------------- diff --git a/crunch/src/it/java/org/apache/crunch/EnumPairIT.java b/crunch/src/it/java/org/apache/crunch/EnumPairIT.java new file mode 100644 index 0000000..aa4f0c4 --- /dev/null +++ b/crunch/src/it/java/org/apache/crunch/EnumPairIT.java @@ -0,0 +1,59 @@ +/** + * 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; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.io.Serializable; + +import org.apache.crunch.impl.mr.MRPipeline; +import org.apache.crunch.test.TemporaryPath; +import org.apache.crunch.test.TemporaryPaths; +import org.apache.crunch.types.writable.Writables; +import org.apache.crunch.util.PTypes; +import org.junit.Rule; +import org.junit.Test; + +public class EnumPairIT implements Serializable { + @Rule + public transient TemporaryPath tmpDir = TemporaryPaths.create(); + + static enum etypes { + type1, + } + + @Test + public void testEnumPTypes() throws IOException { + String inputFile1 = tmpDir.copyResourceFileName("set1.txt"); + Pipeline pipeline = new MRPipeline(EnumPairIT.class); + PCollection<String> set1 = pipeline.readTextFile(inputFile1); + PTable<String, etypes> data = set1.parallelDo(new DoFn<String, Pair<String, etypes>>() { + @Override + public void process(String input, Emitter<Pair<String, etypes>> emitter) { + emitter.emit(new Pair<String, etypes>(input, etypes.type1)); + } + }, Writables.tableOf(Writables.strings(), PTypes.enums(etypes.class, set1.getTypeFamily()))); + + Iterable<Pair<String, etypes>> materialized = data.materialize(); + pipeline.run(); + for (Pair<String, etypes> pair : materialized) { + assertEquals(etypes.type1, pair.second()); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/568e91cb/crunch/src/main/java/org/apache/crunch/util/PTypes.java ---------------------------------------------------------------------- diff --git a/crunch/src/main/java/org/apache/crunch/util/PTypes.java b/crunch/src/main/java/org/apache/crunch/util/PTypes.java index e31dad3..64fb5f6 100644 --- a/crunch/src/main/java/org/apache/crunch/util/PTypes.java +++ b/crunch/src/main/java/org/apache/crunch/util/PTypes.java @@ -59,6 +59,10 @@ public class PTypes { return typeFamily.derived(clazz, new ThriftInputMapFn<T>(clazz), new ThriftOutputMapFn<T>(), typeFamily.bytes()); } + public static final <T extends Enum> PType<T> enums(final Class<T> type, PTypeFamily typeFamily) { + return typeFamily.derived(type, new EnumInputMapper<T>(type), new EnumOutputMapper<T>(), typeFamily.strings()); + } + public static MapFn<ByteBuffer, BigInteger> BYTE_TO_BIGINT = new MapFn<ByteBuffer, BigInteger>() { public BigInteger map(ByteBuffer input) { return input == null ? null : new BigInteger(input.array()); @@ -205,4 +209,25 @@ public class PTypes { } } } + + public static class EnumInputMapper<T extends Enum> extends MapFn<String, T> { + private final Class<T> type; + + public EnumInputMapper(Class<T> type) { + this.type = type; + } + + @Override + public T map(String input) { + return (T) Enum.valueOf(type, input); + } + }; + + public static class EnumOutputMapper<T extends Enum> extends MapFn<T, String> { + + @Override + public String map(T input) { + return input.name(); + } + }; }
