package net.ion.craken.node.mr; import java.util.Iterator; import java.util.Map; import java.util.concurrent.Future; import junit.framework.TestCase; import net.ion.craken.mr.NodeMapReduce; import net.ion.craken.node.ReadSession; import net.ion.craken.node.TransactionJob; import net.ion.craken.node.WriteSession; import net.ion.craken.node.crud.Craken; import net.ion.craken.node.crud.tree.impl.PropertyId; import net.ion.craken.node.crud.tree.impl.PropertyValue; import net.ion.craken.node.crud.tree.impl.TreeNodeKey; import net.ion.framework.util.Debug; import net.ion.framework.util.ListUtil; import net.ion.framework.util.RandomUtil; import org.infinispan.atomic.AtomicMap; import org.infinispan.distexec.mapreduce.Collector; import com.google.common.base.Function; public class TestNodeMapReduce extends TestCase { private ReadSession session; private Craken r; @Override protected void setUp() throws Exception { super.setUp(); this.r = Craken.local(); r.start(); this.session = r.login("my"); session.tranSync(new TransactionJob<Void>() { @Override public Void handle(WriteSession wsession) throws Exception { for (int i : ListUtil.rangeNum(30)) { wsession.pathBy("/bleujin/" + i).property("age", RandomUtil.nextInt(30)) ; } return null; } }); } @Override protected void tearDown() throws Exception { r.shutdown() ; super.tearDown(); } public void testSyncPropertyCount() throws Exception { Map<String, Integer> generationMap = session.mapReduceSync(new MyTask()) ; Debug.line(generationMap); } public void testAsync() throws Exception { Future<Void> future = session.mapReduce(new MyTask(), new Function<Map<String, Integer>, Void>() { @Override public Void apply(Map<String, Integer> result) { Debug.line(result) ; return null; } }); future.get() ; } private static class MyTask implements NodeMapReduce<String, Integer> { private static final long serialVersionUID = -5943370243108735560L; @Override public void map(TreeNodeKey key, AtomicMap<PropertyId, PropertyValue> mapValue, Collector<String, Integer> c) { if (! key.getFqn().toString().startsWith("/bleujin/")) return ; PropertyValue value = mapValue.get(PropertyId.normal("age")); if (value == null) return ; if (value.intValue(0) > 18){ c.emit("youth", 1); } else if (value.intValue(0) > 8){ c.emit("young", 1); } else { c.emit("child", 1); } } @Override public Integer reduce(String key, Iterator<Integer> iter) { int sum = 0; while (iter.hasNext()) { Integer i = (Integer) iter.next(); sum += i; } return sum; } } }