From b5168b17e588f5221c7d05a2c991967a00bb7c8e Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 24 Jun 2014 09:45:44 -0400 Subject: [PATCH] work on CatRank --- .../java/org/capnproto/benchmark/CatRank.java | 66 ++++++++++++++++++- .../main/java/org/capnproto/StructList.java | 26 +++++++- 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/benchmark/src/main/java/org/capnproto/benchmark/CatRank.java b/benchmark/src/main/java/org/capnproto/benchmark/CatRank.java index edce78f..387374b 100644 --- a/benchmark/src/main/java/org/capnproto/benchmark/CatRank.java +++ b/benchmark/src/main/java/org/capnproto/benchmark/CatRank.java @@ -9,16 +9,78 @@ public class CatRank extends TestCase { + static class ScoredResult implements Comparable { + public double score; + public SearchResult.Reader result; + + public ScoredResult(double score, SearchResult.Reader result) { + this.score = score; this.result = result; + } + + public int compareTo(ScoredResult other) { + if (this.score < other.score) { + return -1; + } else { + return 1; + } + } + } + + + static final String URL_PREFIX = "http://example.com"; public Integer setupRequest(Common.FastRand rng, SearchResultList.Builder request) { - return 0; + int count = rng.nextLessThan(1000); + int goodCount = 0; + + StructList.Builder list = request.initResults(count); + for (int i = 0; i < list.size(); ++i) { + SearchResult.Builder result = list.get(i); + result.setScore(1000.0 - (double)i); + int urlSize = rng.nextLessThan(100); + } + + // ... + + return goodCount; } public void handleRequest(SearchResultList.Reader request, SearchResultList.Builder response) { + java.util.ArrayList scoredResults = new java.util.ArrayList(); + + for (SearchResult.Reader result : request.getResults()) { + double score = result.getScore(); + if (result.getSnippet().toString().contains(" cat ")) { + score *= 10000.0; + } + if (result.getSnippet().toString().contains(" dog ")) { + score /= 10000.0; + } + scoredResults.add(new ScoredResult(score, result)); + } + + java.util.Collections.sort(scoredResults); + + StructList.Builder list = response.initResults(scoredResults.size()); + for (int i = 0; i < list.size(); ++i) { + SearchResult.Builder item = list.get(i); + ScoredResult result = scoredResults.get(i); + item.setScore(result.score); + item.setUrl(result.result.getUrl()); + item.setSnippet(result.result.getSnippet()); + } } public boolean checkResponse(SearchResultList.Reader response, Integer expectedGoodCount) { - return true; + int goodCount = 0; + for (SearchResult.Reader result : response.getResults()) { + if (result.getScore() > 1001.0) { + goodCount += 1; + } else { + break; + } + } + return goodCount == expectedGoodCount; } } diff --git a/runtime/src/main/java/org/capnproto/StructList.java b/runtime/src/main/java/org/capnproto/StructList.java index 9d0147d..49d1a8b 100644 --- a/runtime/src/main/java/org/capnproto/StructList.java +++ b/runtime/src/main/java/org/capnproto/StructList.java @@ -42,7 +42,7 @@ public final class StructList { } } - public static final class Builder { + public static final class Builder implements Iterable { public final ListBuilder builder; public final FromStructBuilder factory; @@ -65,6 +65,30 @@ public final class StructList { return this.factory.fromStructBuilder(this.builder.getStructElement(index)); } + + public final class Iterator implements java.util.Iterator { + public Builder list; + public int idx = 0; + public Iterator(Builder list) { + this.list = list; + } + + public T next() { + return list.factory.fromStructBuilder(list.builder.getStructElement(idx++)); + } + public boolean hasNext() { + return idx < list.size(); + } + public void remove() { + throw new UnsupportedOperationException(); + } + } + + public java.util.Iterator iterator() { + return new Iterator(this); + } + + } }