You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2015/11/04 13:43:34 UTC
[3/9] incubator-tinkerpop git commit: Integrated NumberHelper in Min-,
Max- and MeanStep
Integrated NumberHelper in Min-, Max- and MeanStep
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/eba71143
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/eba71143
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/eba71143
Branch: refs/heads/master
Commit: eba7114341b1257106db2111ed8b90b2012c0860
Parents: eda16b5
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Sun Nov 1 12:55:26 2015 +0100
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Sun Nov 1 12:55:26 2015 +0100
----------------------------------------------------------------------
.../gremlin/process/traversal/NumberHelper.java | 12 ++++-
.../traversal/step/map/MaxGlobalStep.java | 14 ++---
.../traversal/step/map/MaxLocalStep.java | 5 +-
.../traversal/step/map/MeanGlobalStep.java | 57 +++++++++++---------
.../traversal/step/map/MinGlobalStep.java | 14 ++---
.../traversal/step/map/MinLocalStep.java | 5 +-
.../structure/TinkerGraphPlayTest.java | 9 ++--
7 files changed, 67 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java
index 8dfd113..b094f29 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java
@@ -162,8 +162,12 @@ public class NumberHelper {
}
public static Class<? extends Number> getHighestCommonNumberClass(final Number... numbers) {
+ return getHighestCommonNumberClass(false, numbers);
+ }
+
+ public static Class<? extends Number> getHighestCommonNumberClass(final boolean forceFloatingPoint, final Number... numbers) {
int bits = 8;
- boolean fp = false;
+ boolean fp = forceFloatingPoint;
for (final Number number : numbers) {
if (number == null) continue;
final Class<? extends Number> clazz = number.getClass();
@@ -207,7 +211,11 @@ public class NumberHelper {
}
public static Number div(final Number a, final Number b) {
- final Class<? extends Number> clazz = getHighestCommonNumberClass(a, b);
+ return div(a, b, false);
+ }
+
+ public static Number div(final Number a, final Number b, final boolean forceFloatingPoint) {
+ final Class<? extends Number> clazz = getHighestCommonNumberClass(forceFloatingPoint, a, b);
return getHelper(clazz).div.apply(a, b);
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
index d7dc34d..d876d2d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
@@ -37,6 +37,8 @@ import java.util.Iterator;
import java.util.Set;
import java.util.function.BiFunction;
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.max;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -70,10 +72,11 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
@Override
public S apply(final S mutatingSeed, final Traverser<S> traverser) {
- return mutatingSeed != null && mutatingSeed.doubleValue() >= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+ final S value = traverser.get();
+ return mutatingSeed != null ? (S) max(mutatingSeed, traverser.get()) : value;
}
- public final static <S extends Number> MaxGlobalBiFunction<S> instance() {
+ public static <S extends Number> MaxGlobalBiFunction<S> instance() {
return INSTANCE;
}
}
@@ -106,11 +109,10 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
@Override
public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
if (values.hasNext()) {
- Number max = -Double.MAX_VALUE;
+ Number max = null;
while (values.hasNext()) {
final Number value = values.next();
- if (value.doubleValue() > max.doubleValue())
- max = value;
+ max = max != null ? max(value, max) : value;
}
emitter.emit(max);
}
@@ -127,7 +129,7 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
}
- public static final MaxGlobalMapReduce instance() {
+ public static MaxGlobalMapReduce instance() {
return INSTANCE;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
index 6d2a228..dc4c5ce 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
@@ -26,6 +26,8 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.max;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @author Daniel Kuppitz (http://gremlin.guru)
@@ -43,8 +45,7 @@ public final class MaxLocalStep<E extends Number, S extends Iterable<E>> extends
if (iterator.hasNext()) {
result = iterator.next();
while (iterator.hasNext()) {
- final Number curr = iterator.next();
- if (result.doubleValue() < curr.doubleValue()) result = curr;
+ result = max(iterator.next(), result);
}
} else {
result = Double.NaN;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
index 66092a5..f658271 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
@@ -18,17 +18,18 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.NumberHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.FinalGet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.FinalGet;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier;
@@ -39,6 +40,10 @@ import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Supplier;
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.add;
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.div;
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.mul;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @author Daniel Kuppitz (http://gremlin.guru)
@@ -59,7 +64,7 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re
}
@Override
- public MapReduce<Number, Long, Number, Long, Double> getMapReduce() {
+ public MapReduce<Number, Long, Number, Long, Number> getMapReduce() {
return MeanGlobalMapReduce.instance();
}
@@ -78,14 +83,14 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re
return (S) ((MeanNumber) mutatingSeed).add(traverser.get(), traverser.bulk());
}
- public final static <S extends Number> MeanGlobalBiFunction<S> instance() {
+ public static <S extends Number> MeanGlobalBiFunction<S> instance() {
return INSTANCE;
}
}
///////////
- private static final class MeanGlobalMapReduce extends StaticMapReduce<Number, Long, Number, Long, Double> {
+ private static final class MeanGlobalMapReduce extends StaticMapReduce<Number, Long, Number, Long, Number> {
private static final MeanGlobalMapReduce INSTANCE = new MeanGlobalMapReduce();
@@ -123,81 +128,83 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re
}
@Override
- public Double generateFinalResult(final Iterator<KeyValue<Number, Long>> keyValues) {
+ public Number generateFinalResult(final Iterator<KeyValue<Number, Long>> keyValues) {
if (keyValues.hasNext()) {
KeyValue<Number, Long> pair = keyValues.next();
- double result = pair.getKey().doubleValue() * pair.getValue();
long counter = pair.getValue();
+ Number result = mul(pair.getKey(), counter);
while (keyValues.hasNext()) {
+ long incr = pair.getValue();
pair = keyValues.next();
- result += pair.getKey().doubleValue() * pair.getValue();
- counter += pair.getValue();
+ result = add(result, mul(pair.getKey(), incr));
+ counter += incr;
}
- return result / counter;
+ return div(result, counter, true);
}
return Double.NaN;
}
- public static final MeanGlobalMapReduce instance() {
+ public static MeanGlobalMapReduce instance() {
return INSTANCE;
}
}
///
- public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
+ public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Number> {
private long count;
- private double sum;
+ private Number sum;
public MeanNumber() {
- this(0.0d, 0l);
+ this(0, 0);
}
- public MeanNumber(final double number, final long count) {
+ public MeanNumber(final Number number, final long count) {
this.count = count;
- this.sum = number * count;
+ this.sum = mul(number, count);
}
public MeanNumber add(final Number amount, final long count) {
this.count += count;
- this.sum += amount.doubleValue() * count;
+ this.sum = NumberHelper.add(sum, mul(amount, count));
return this;
}
public MeanNumber add(final MeanNumber other) {
this.count += other.count;
- this.sum += other.sum;
+ this.sum = NumberHelper.add(sum, other.sum);
return this;
}
@Override
public int intValue() {
- return (int) (this.sum / this.count);
+ return div(this.sum, this.count).intValue();
}
@Override
public long longValue() {
- return (long) (this.sum / this.count);
+ return div(this.sum, this.count).longValue();
}
@Override
public float floatValue() {
- return (float) (this.sum / this.count);
+ return div(this.sum, this.count, true).floatValue();
}
@Override
public double doubleValue() {
- return this.sum / this.count;
+ return div(this.sum, this.count, true).doubleValue();
}
@Override
public String toString() {
- return Double.toString(this.doubleValue());
+ return div(this.sum, this.count, true).toString();
}
@Override
public int compareTo(final Number number) {
+ // TODO: NumberHelper should provide a compareTo() implementation
return Double.valueOf(this.doubleValue()).compareTo(number.doubleValue());
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
index 6a3ba10..750e36c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
@@ -37,6 +37,8 @@ import java.util.Iterator;
import java.util.Set;
import java.util.function.BiFunction;
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.min;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -70,10 +72,11 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
@Override
public S apply(final S mutatingSeed, final Traverser<S> traverser) {
- return mutatingSeed != null && mutatingSeed.doubleValue() <= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+ final S value = traverser.get();
+ return mutatingSeed != null ? (S) min(mutatingSeed, traverser.get()) : value;
}
- public final static <S extends Number> MinGlobalBiFunction<S> instance() {
+ public static <S extends Number> MinGlobalBiFunction<S> instance() {
return INSTANCE;
}
}
@@ -106,11 +109,10 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
@Override
public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
if (values.hasNext()) {
- Number min = Double.MAX_VALUE;
+ Number min = null;
while (values.hasNext()) {
final Number value = values.next();
- if (value.doubleValue() < min.doubleValue())
- min = value;
+ min = min != null ? min(value, min) : value;
}
emitter.emit(min);
}
@@ -126,7 +128,7 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
}
- public static final MinGlobalMapReduce instance() {
+ public static MinGlobalMapReduce instance() {
return INSTANCE;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
index 2959285..116a5e1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
@@ -26,6 +26,8 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.min;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @author Daniel Kuppitz (http://gremlin.guru)
@@ -43,8 +45,7 @@ public final class MinLocalStep<E extends Number, S extends Iterable<E>> extends
if (iterator.hasNext()) {
result = iterator.next();
while (iterator.hasNext()) {
- final Number curr = iterator.next();
- if (result.doubleValue() > curr.doubleValue()) result = curr;
+ result = min(iterator.next(), result);
}
} else {
result = Double.NaN;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index efb4a5b..d5a7d1d 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -192,12 +192,9 @@ public class TinkerGraphPlayTest {
@Test
@Ignore
public void testPlayDK() throws Exception {
- final Number n = __.inject(1, 2L, 3f).sum().next();
- System.out.println(n.toString());
- System.out.println(n.getClass().toString());
- final Double d = __.inject(1, 2L, 3f).<Double>sum().next();
- System.out.println(d.toString());
- System.out.println(d.getClass().toString());
+ TinkerGraph graph = TinkerFactory.createModern();
+ GraphTraversalSource g = graph.traversal(GraphTraversalSource.standard());
+ final Number m = g.V().values("age").mean().next();
}
@Test