dschneider-pivotal commented on a change in pull request #6861:
URL: https://github.com/apache/geode/pull/6861#discussion_r716934456
##########
File path:
geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSortedSet.java
##########
@@ -607,6 +669,87 @@ private void addIfMatching(GlobPattern matchPattern,
List<byte[]> resultList, by
}
}
+ private void computeIntersection(List<RedisSortedSet> sets, ZAggregator
aggregator) {
+ RedisSortedSet retVal = new RedisSortedSet(Collections.emptyList(), new
double[] {});
+ RedisSortedSet smallestSet = sets.get(0);
+
+ for (RedisSortedSet set : sets) {
+ if (set.getSortedSetSize() < smallestSet.getSortedSetSize()) {
+ smallestSet = set;
+ }
+ }
+
+ for (byte[] member : smallestSet.members.keySet()) {
+ Double newScore;
+ if (aggregator.equals(ZAggregator.SUM)) {
+ newScore = getSumOfScoresForMember(sets, member);
+ } else if (aggregator.equals(ZAggregator.MAX)) {
+ newScore = getMaxScoreForMember(sets, member);
+ } else {
+ newScore = getMinScoreForMember(sets, member);
+ }
+
+ if (newScore != null) {
+ if (newScore.isNaN()) {
+ throw new ArithmeticException(ERROR_OPERATION_PRODUCED_NAN);
+ }
+ retVal.memberAdd(member, newScore);
+ }
+ }
+ }
+
+ private Double getSumOfScoresForMember(List<RedisSortedSet> sets, byte[]
memberName) {
+ OrderedSetEntry member;
+ double runningTotal = 0;
+
+ for (RedisSortedSet set : sets) {
+ if ((member = set.members.get(memberName)) != null) {
+ if (Double.isInfinite(runningTotal) && member.getScore() ==
-runningTotal) {
+ runningTotal = 0;
+ } else {
+ runningTotal += member.getScore();
+ }
+ } else {
+ return null;
+ }
+ }
+
+ this.memberAdd(memberName, runningTotal);
+ return runningTotal;
+ }
+
+ private Double getMaxScoreForMember(List<RedisSortedSet> sets, byte[]
member) {
+ double runningMax = Double.MIN_VALUE;
+ for (RedisSortedSet set : sets) {
+ if (set.members.containsKey(member)) {
Review comment:
You had a question about an old comment I made about containsKey. In
this code instead of calling members.containsKey on line 724 followed by
members.get on line 725 you could just call members.get and test for null. That
way you do one map lookup instead of two.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]