Updated Branches: refs/heads/master fd1fc3ad6 -> a92a523fb
CRUNCH-35: Add scrunch.PTable#mapKeys Signed-off-by: jwills <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/incubator-crunch/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-crunch/commit/a92a523f Tree: http://git-wip-us.apache.org/repos/asf/incubator-crunch/tree/a92a523f Diff: http://git-wip-us.apache.org/repos/asf/incubator-crunch/diff/a92a523f Branch: refs/heads/master Commit: a92a523fb72a3d3180d43115762442e4ccf881f3 Parents: fd1fc3a Author: Brian Martin <[email protected]> Authored: Mon Aug 6 18:21:00 2012 -0700 Committer: jwills <[email protected]> Committed: Mon Aug 6 19:36:17 2012 -0700 ---------------------------------------------------------------------- .../src/main/scala/org/apache/scrunch/PTable.scala | 14 ++++++ .../scala/org/apache/scrunch/MapKeysFnTest.scala | 36 +++++++++++++++ 2 files changed, 50 insertions(+), 0 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/a92a523f/scrunch/src/main/scala/org/apache/scrunch/PTable.scala ---------------------------------------------------------------------- diff --git a/scrunch/src/main/scala/org/apache/scrunch/PTable.scala b/scrunch/src/main/scala/org/apache/scrunch/PTable.scala index b6d95a6..7f506e5 100644 --- a/scrunch/src/main/scala/org/apache/scrunch/PTable.scala +++ b/scrunch/src/main/scala/org/apache/scrunch/PTable.scala @@ -44,6 +44,12 @@ class PTable[K, V](val native: JTable[K, V]) extends PCollectionLike[CPair[K, V] parallelDo(mapValuesFn[K, V, T](f), ptype) } + def mapKeys[T](f: K => T)(implicit pt: PTypeH[T]) = { + val ptf = getTypeFamily() + val ptype = ptf.tableOf(pt.get(ptf), native.getValueType()) + parallelDo(mapKeysFn[K, V, T](f), ptype) + } + def flatMap[T, To](f: (K, V) => Traversable[T]) (implicit pt: PTypeH[T], b: CanParallelTransform[T, To]): To = { b(this, flatMapFn(f), pt.get(getTypeFamily())) @@ -158,6 +164,10 @@ trait SMapTableValuesFn[K, V, T] extends MapFn[CPair[K, V], CPair[K, T]] with Fu override def map(input: CPair[K, V]) = CPair.of(input.first(), apply(input.second())) } +trait SMapTableKeysFn[K, V, T] extends MapFn[CPair[K, V], CPair[T, V]] with Function1[K, T] { + override def map(input: CPair[K, V]) = CPair.of(apply(input.first()), input.second()) +} + object PTable { def filterFn[K, V](fn: (K, V) => Boolean) = { new SFilterTableFn[K, V] { def apply(k: K, v: V) = fn(k, v) } @@ -167,6 +177,10 @@ object PTable { new SMapTableValuesFn[K, V, T] { def apply(v: V) = fn(v) } } + def mapKeysFn[K, V, T](fn: K => T) = { + new SMapTableKeysFn[K, V, T] { def apply(k: K) = fn(k) } + } + def mapFn[K, V, T](fn: (K, V) => T) = { new SMapTableFn[K, V, T] { def apply(k: K, v: V) = fn(k, v) } } http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/a92a523f/scrunch/src/test/scala/org/apache/scrunch/MapKeysFnTest.scala ---------------------------------------------------------------------- diff --git a/scrunch/src/test/scala/org/apache/scrunch/MapKeysFnTest.scala b/scrunch/src/test/scala/org/apache/scrunch/MapKeysFnTest.scala new file mode 100644 index 0000000..011a1b4 --- /dev/null +++ b/scrunch/src/test/scala/org/apache/scrunch/MapKeysFnTest.scala @@ -0,0 +1,36 @@ +/** + * 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.scrunch + +import _root_.org.scalatest.junit.JUnitSuite +import _root_.org.junit.Test + +class MapKeysFnTest extends JUnitSuite { + + @Test + def testMapKeys() { + val orig = Mem.tableOf(1 -> "a", 2 -> "b", 3 -> "c") + val inc = orig.mapKeys(_ + 1) + + assert( + inc.keys.materialize + .zip(orig.keys.materialize) + .forall(x => x._1 == x._2 + 1)) + } + +} \ No newline at end of file
