summaryrefslogtreecommitdiffstats
path: root/sonar-batch
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2015-02-17 10:45:24 +0100
committerJulien HENRY <julien.henry@sonarsource.com>2015-02-17 10:57:48 +0100
commit6d1181b1d597d2e629ec30f9de41345768cd3cbd (patch)
tree9a648e21b9198d7938ca2f5a36717865f8534ea3 /sonar-batch
parent45d09ec06ee543bdae2732cb06eb1d51d9c46a10 (diff)
downloadsonarqube-6d1181b1d597d2e629ec30f9de41345768cd3cbd.tar.gz
sonarqube-6d1181b1d597d2e629ec30f9de41345768cd3cbd.zip
SONAR-6068 Make persisit iterators "reusable"
Diffstat (limited to 'sonar-batch')
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/index/Cache.java73
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/index/CacheTest.java29
2 files changed, 54 insertions, 48 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/Cache.java b/sonar-batch/src/main/java/org/sonar/batch/index/Cache.java
index c98b88773e6..02efaab0f00 100644
--- a/sonar-batch/src/main/java/org/sonar/batch/index/Cache.java
+++ b/sonar-batch/src/main/java/org/sonar/batch/index/Cache.java
@@ -300,15 +300,7 @@ public class Cache<V> {
* Lazy-loading values for given keys
*/
public Iterable<V> values(Object firstKey, Object secondKey) {
- try {
- exchange.clear();
- exchange.append(firstKey).append(secondKey).append(Key.BEFORE);
- Exchange iteratorExchange = new Exchange(exchange);
- KeyFilter filter = new KeyFilter().append(KeyFilter.simpleTerm(firstKey)).append(KeyFilter.simpleTerm(secondKey));
- return new ValueIterable<V>(iteratorExchange, filter);
- } catch (Exception e) {
- throw failToGetValues(e);
- }
+ return new ValueIterable<V>(exchange, firstKey, secondKey);
}
private IllegalStateException failToGetValues(Exception e) {
@@ -319,41 +311,22 @@ public class Cache<V> {
* Lazy-loading values for a given key
*/
public Iterable<V> values(Object firstKey) {
- try {
- exchange.clear();
- exchange.append(firstKey).append(Key.BEFORE);
- Exchange iteratorExchange = new Exchange(exchange);
- KeyFilter filter = new KeyFilter().append(KeyFilter.simpleTerm(firstKey));
- return new ValueIterable<V>(iteratorExchange, filter);
- } catch (Exception e) {
- throw failToGetValues(e);
- }
+ return new ValueIterable<V>(exchange, firstKey);
}
/**
* Lazy-loading values
*/
public Iterable<V> values() {
- try {
- exchange.clear().append(Key.BEFORE);
- Exchange iteratorExchange = new Exchange(exchange);
- KeyFilter filter = new KeyFilter().append(KeyFilter.ALL);
- return new ValueIterable<V>(iteratorExchange, filter);
- } catch (Exception e) {
- throw failToGetValues(e);
- }
+ return new ValueIterable<V>(exchange);
}
public Iterable<Entry<V>> entries() {
- exchange.clear().to(Key.BEFORE);
- KeyFilter filter = new KeyFilter().append(KeyFilter.ALL);
- return new EntryIterable<V>(new Exchange(exchange), filter);
+ return new EntryIterable<V>(exchange);
}
public Iterable<Entry<V>> entries(Object firstKey) {
- exchange.clear().append(firstKey).append(Key.BEFORE);
- KeyFilter filter = new KeyFilter().append(KeyFilter.simpleTerm(firstKey));
- return new EntryIterable<V>(new Exchange(exchange), filter);
+ return new EntryIterable<V>(exchange, firstKey);
}
private void resetKey(Object key) {
@@ -383,15 +356,25 @@ public class Cache<V> {
//
private static class ValueIterable<T> implements Iterable<T> {
- private final Iterator<T> iterator;
+ private final Exchange originExchange;
+ private final Object[] keys;
- private ValueIterable(Exchange exchange, KeyFilter keyFilter) {
- this.iterator = new ValueIterator<T>(exchange, keyFilter);
+ private ValueIterable(Exchange originExchange, Object... keys) {
+ this.originExchange = originExchange;
+ this.keys = keys;
}
@Override
public Iterator<T> iterator() {
- return iterator;
+ originExchange.clear();
+ KeyFilter filter = new KeyFilter();
+ for (Object key : keys) {
+ originExchange.append(key);
+ filter = filter.append(KeyFilter.simpleTerm(key));
+ }
+ originExchange.append(Key.BEFORE);
+ Exchange iteratorExchange = new Exchange(originExchange);
+ return new ValueIterator<T>(iteratorExchange, filter);
}
}
@@ -434,15 +417,25 @@ public class Cache<V> {
}
private static class EntryIterable<T> implements Iterable<Entry<T>> {
- private final EntryIterator<T> it;
+ private final Exchange originExchange;
+ private final Object[] keys;
- private EntryIterable(Exchange exchange, KeyFilter keyFilter) {
- it = new EntryIterator<T>(exchange, keyFilter);
+ private EntryIterable(Exchange originExchange, Object... keys) {
+ this.originExchange = originExchange;
+ this.keys = keys;
}
@Override
public Iterator<Entry<T>> iterator() {
- return it;
+ originExchange.clear();
+ KeyFilter filter = new KeyFilter();
+ for (Object key : keys) {
+ originExchange.append(key);
+ filter = filter.append(KeyFilter.simpleTerm(key));
+ }
+ originExchange.append(Key.BEFORE);
+ Exchange iteratorExchange = new Exchange(originExchange);
+ return new EntryIterator<T>(iteratorExchange, filter);
}
}
diff --git a/sonar-batch/src/test/java/org/sonar/batch/index/CacheTest.java b/sonar-batch/src/test/java/org/sonar/batch/index/CacheTest.java
index 9bae728f375..0235af3dc89 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/index/CacheTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/index/CacheTest.java
@@ -25,6 +25,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+import org.sonar.batch.index.Cache.Entry;
import static org.assertj.core.api.Assertions.assertThat;
@@ -57,11 +58,15 @@ public class CacheTest {
assertThat(cache.get("france")).isEqualTo("paris");
assertThat(cache.keySet()).containsOnly("france", "italy");
assertThat(cache.keySet("france")).isEmpty();
- assertThat(cache.values()).containsOnly("paris", "rome");
+ Iterable<String> values = cache.values();
+ assertThat(values).containsOnly("paris", "rome");
+ assertThat(values).containsOnly("paris", "rome");
assertThat(cache.containsKey("france")).isTrue();
- Cache.Entry[] entries = Iterables.toArray(cache.entries(), Cache.Entry.class);
+ Iterable<Entry<String>> iterable = cache.entries();
+ Cache.Entry[] entries = Iterables.toArray(iterable, Cache.Entry.class);
assertThat(entries).hasSize(2);
+ assertThat(iterable).hasSize(2);
assertThat(entries[0].key()[0]).isEqualTo("france");
assertThat(entries[0].value()).isEqualTo("paris");
assertThat(entries[1].key()[0]).isEqualTo("italy");
@@ -74,10 +79,10 @@ public class CacheTest {
assertThat(cache.keySet("france")).isEmpty();
assertThat(cache.containsKey("france")).isFalse();
assertThat(cache.containsKey("italy")).isTrue();
- assertThat(cache.values()).containsOnly("rome");
+ assertThat(values).containsOnly("rome");
cache.clear();
- assertThat(cache.values()).isEmpty();
+ assertThat(values).isEmpty();
}
@Test
@@ -114,8 +119,10 @@ public class CacheTest {
assertThat(cache.values("europe")).containsOnly("paris", "rome");
assertThat(cache.values("oceania")).isEmpty();
- Cache.Entry[] allEntries = Iterables.toArray(cache.entries(), Cache.Entry.class);
+ Iterable<Entry<String>> iterable = cache.entries();
+ Cache.Entry[] allEntries = Iterables.toArray(iterable, Cache.Entry.class);
assertThat(allEntries).hasSize(3);
+ assertThat(iterable).hasSize(3);
assertThat(allEntries[0].key()).isEqualTo(new String[] {"asia", "china"});
assertThat(allEntries[0].value()).isEqualTo("pekin");
assertThat(allEntries[1].key()).isEqualTo(new String[] {"europe", "france"});
@@ -123,8 +130,10 @@ public class CacheTest {
assertThat(allEntries[2].key()).isEqualTo(new String[] {"europe", "italy"});
assertThat(allEntries[2].value()).isEqualTo("rome");
- Cache.Entry[] subEntries = Iterables.toArray(cache.entries("europe"), Cache.Entry.class);
+ Iterable<Entry<String>> iterable2 = cache.entries("europe");
+ Cache.Entry[] subEntries = Iterables.toArray(iterable2, Cache.Entry.class);
assertThat(subEntries).hasSize(2);
+ assertThat(iterable2).hasSize(2);
assertThat(subEntries[0].key()).isEqualTo(new String[] {"europe", "france"});
assertThat(subEntries[0].value()).isEqualTo("paris");
assertThat(subEntries[1].key()).isEqualTo(new String[] {"europe", "italy"});
@@ -171,8 +180,10 @@ public class CacheTest {
assertThat(cache.values("europe")).containsOnly("eiffel tower", "lake", "colosseum", "notre dame");
assertThat(cache.values("europe", "france")).containsOnly("eiffel tower", "lake", "notre dame");
- Cache.Entry[] allEntries = Iterables.toArray(cache.entries(), Cache.Entry.class);
+ Iterable<Entry<String>> iterable = cache.entries();
+ Cache.Entry[] allEntries = Iterables.toArray(iterable, Cache.Entry.class);
assertThat(allEntries).hasSize(7);
+ assertThat(iterable).hasSize(7);
assertThat(allEntries[0].key()).isEqualTo(new String[] {"america", "us", "new york"});
assertThat(allEntries[0].value()).isEqualTo("empire state building");
assertThat(allEntries[1].key()).isEqualTo(new String[] {"asia", "china", "pekin"});
@@ -186,8 +197,10 @@ public class CacheTest {
assertThat(allEntries[5].key()).isEqualTo(new String[] {"europe", "italy", "rome"});
assertThat(allEntries[5].value()).isEqualTo("colosseum");
- Cache.Entry[] subEntries = Iterables.toArray(cache.entries("europe"), Cache.Entry.class);
+ Iterable<Entry<String>> iterable2 = cache.entries("europe");
+ Cache.Entry[] subEntries = Iterables.toArray(iterable2, Cache.Entry.class);
assertThat(subEntries).hasSize(4);
+ assertThat(iterable2).hasSize(4);
assertThat(subEntries[0].key()).isEqualTo(new String[] {"europe", "france", "annecy"});
assertThat(subEntries[0].value()).isEqualTo("lake");
assertThat(subEntries[1].key()).isEqualTo(new String[] {"europe", "france", "paris"});