|
@@ -39,6 +39,7 @@ import org.apache.lucene.search.TotalHits;
|
|
|
import org.apache.lucene.store.Directory;
|
|
import org.apache.lucene.store.Directory;
|
|
|
import org.apache.lucene.util.BytesRef;
|
|
import org.apache.lucene.util.BytesRef;
|
|
|
import org.apache.lucene.util.NumericUtils;
|
|
import org.apache.lucene.util.NumericUtils;
|
|
|
|
|
+import org.elasticsearch.common.breaker.CircuitBreaker;
|
|
|
import org.elasticsearch.common.geo.GeoPoint;
|
|
import org.elasticsearch.common.geo.GeoPoint;
|
|
|
import org.elasticsearch.common.network.InetAddresses;
|
|
import org.elasticsearch.common.network.InetAddresses;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
import org.elasticsearch.common.settings.Settings;
|
|
@@ -73,6 +74,7 @@ import org.elasticsearch.search.aggregations.AggregatorTestCase;
|
|
|
import org.elasticsearch.search.aggregations.BucketOrder;
|
|
import org.elasticsearch.search.aggregations.BucketOrder;
|
|
|
import org.elasticsearch.search.aggregations.InternalAggregation;
|
|
import org.elasticsearch.search.aggregations.InternalAggregation;
|
|
|
import org.elasticsearch.search.aggregations.InternalMultiBucketAggregation;
|
|
import org.elasticsearch.search.aggregations.InternalMultiBucketAggregation;
|
|
|
|
|
+import org.elasticsearch.search.aggregations.MultiBucketConsumerService;
|
|
|
import org.elasticsearch.search.aggregations.bucket.MultiBucketsAggregation;
|
|
import org.elasticsearch.search.aggregations.bucket.MultiBucketsAggregation;
|
|
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
|
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
|
|
|
import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder;
|
|
import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder;
|
|
@@ -254,7 +256,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals(5, result.getBuckets().size());
|
|
assertEquals(5, result.getBuckets().size());
|
|
|
assertEquals("", result.getBuckets().get(0).getKeyAsString());
|
|
assertEquals("", result.getBuckets().get(0).getKeyAsString());
|
|
|
assertEquals(2L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(2L, result.getBuckets().get(0).getDocCount());
|
|
@@ -319,11 +321,11 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
.size(12)
|
|
.size(12)
|
|
|
.order(BucketOrder.key(true));
|
|
.order(BucketOrder.key(true));
|
|
|
|
|
|
|
|
- Aggregator aggregator = createAggregator(aggregationBuilder, indexSearcher, fieldType);
|
|
|
|
|
|
|
+ TermsAggregator aggregator = createAggregator(aggregationBuilder, indexSearcher, fieldType);
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals(10, result.getBuckets().size());
|
|
assertEquals(10, result.getBuckets().size());
|
|
|
assertEquals("val000", result.getBuckets().get(0).getKeyAsString());
|
|
assertEquals("val000", result.getBuckets().get(0).getKeyAsString());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -358,7 +360,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals(5, result.getBuckets().size());
|
|
assertEquals(5, result.getBuckets().size());
|
|
|
assertEquals("val001", result.getBuckets().get(0).getKeyAsString());
|
|
assertEquals("val001", result.getBuckets().get(0).getKeyAsString());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -382,7 +384,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals(8, result.getBuckets().size());
|
|
assertEquals(8, result.getBuckets().size());
|
|
|
assertEquals("val002", result.getBuckets().get(0).getKeyAsString());
|
|
assertEquals("val002", result.getBuckets().get(0).getKeyAsString());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -411,7 +413,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals(2, result.getBuckets().size());
|
|
assertEquals(2, result.getBuckets().size());
|
|
|
assertEquals("val010", result.getBuckets().get(0).getKeyAsString());
|
|
assertEquals("val010", result.getBuckets().get(0).getKeyAsString());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -428,7 +430,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals(2, result.getBuckets().size());
|
|
assertEquals(2, result.getBuckets().size());
|
|
|
assertEquals("val000", result.getBuckets().get(0).getKeyAsString());
|
|
assertEquals("val000", result.getBuckets().get(0).getKeyAsString());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -446,7 +448,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals(2, result.getBuckets().size());
|
|
assertEquals(2, result.getBuckets().size());
|
|
|
assertEquals("val000", result.getBuckets().get(0).getKeyAsString());
|
|
assertEquals("val000", result.getBuckets().get(0).getKeyAsString());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -497,11 +499,11 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
.includeExclude(new IncludeExclude(new long[]{0, 5}, null))
|
|
.includeExclude(new IncludeExclude(new long[]{0, 5}, null))
|
|
|
.field("long_field")
|
|
.field("long_field")
|
|
|
.order(BucketOrder.key(true));
|
|
.order(BucketOrder.key(true));
|
|
|
- Aggregator aggregator = createAggregator(aggregationBuilder, indexSearcher, fieldType);
|
|
|
|
|
|
|
+ TermsAggregator aggregator = createAggregator(aggregationBuilder, indexSearcher, fieldType);
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals(2, result.getBuckets().size());
|
|
assertEquals(2, result.getBuckets().size());
|
|
|
assertEquals(0L, result.getBuckets().get(0).getKey());
|
|
assertEquals(0L, result.getBuckets().get(0).getKey());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -518,7 +520,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals(4, result.getBuckets().size());
|
|
assertEquals(4, result.getBuckets().size());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getKey());
|
|
assertEquals(1L, result.getBuckets().get(0).getKey());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -541,7 +543,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals(2, result.getBuckets().size());
|
|
assertEquals(2, result.getBuckets().size());
|
|
|
assertEquals(0.0, result.getBuckets().get(0).getKey());
|
|
assertEquals(0.0, result.getBuckets().get(0).getKey());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -558,7 +560,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals(4, result.getBuckets().size());
|
|
assertEquals(4, result.getBuckets().size());
|
|
|
assertEquals(1.0, result.getBuckets().get(0).getKey());
|
|
assertEquals(1.0, result.getBuckets().get(0).getKey());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -724,7 +726,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals(size, result.getBuckets().size());
|
|
assertEquals(size, result.getBuckets().size());
|
|
|
for (int i = 0; i < size; i++) {
|
|
for (int i = 0; i < size; i++) {
|
|
|
Map.Entry<T, Integer> expected = expectedBuckets.get(i);
|
|
Map.Entry<T, Integer> expected = expectedBuckets.get(i);
|
|
@@ -750,7 +752,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = ((Filter) aggregator.buildTopLevel()).getAggregations().get("_name2");
|
|
|
|
|
|
|
+ result = ((Filter) reduce(aggregator)).getAggregations().get("_name2");
|
|
|
int expectedFilteredCounts = 0;
|
|
int expectedFilteredCounts = 0;
|
|
|
for (Integer count : filteredCounts.values()) {
|
|
for (Integer count : filteredCounts.values()) {
|
|
|
if (count > 0) {
|
|
if (count > 0) {
|
|
@@ -823,7 +825,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals(size, result.getBuckets().size());
|
|
assertEquals(size, result.getBuckets().size());
|
|
|
for (int i = 0; i < size; i++) {
|
|
for (int i = 0; i < size; i++) {
|
|
|
Map.Entry<T, Long> expected = expectedBuckets.get(i);
|
|
Map.Entry<T, Long> expected = expectedBuckets.get(i);
|
|
@@ -852,7 +854,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals("_name", result.getName());
|
|
assertEquals("_name", result.getName());
|
|
|
assertEquals(0, result.getBuckets().size());
|
|
assertEquals(0, result.getBuckets().size());
|
|
|
|
|
|
|
@@ -862,7 +864,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals("_name", result.getName());
|
|
assertEquals("_name", result.getName());
|
|
|
assertEquals(0, result.getBuckets().size());
|
|
assertEquals(0, result.getBuckets().size());
|
|
|
|
|
|
|
@@ -872,7 +874,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ result = reduce(aggregator);
|
|
|
assertEquals("_name", result.getName());
|
|
assertEquals("_name", result.getName());
|
|
|
assertEquals(0, result.getBuckets().size());
|
|
assertEquals(0, result.getBuckets().size());
|
|
|
}
|
|
}
|
|
@@ -895,7 +897,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals("_name", result.getName());
|
|
assertEquals("_name", result.getName());
|
|
|
assertEquals(0, result.getBuckets().size());
|
|
assertEquals(0, result.getBuckets().size());
|
|
|
assertFalse(AggregationInspectionHelper.hasValue((InternalTerms)result));
|
|
assertFalse(AggregationInspectionHelper.hasValue((InternalTerms)result));
|
|
@@ -931,7 +933,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals("_name", result.getName());
|
|
assertEquals("_name", result.getName());
|
|
|
assertEquals(1, result.getBuckets().size());
|
|
assertEquals(1, result.getBuckets().size());
|
|
|
assertEquals(missingValues[i], result.getBuckets().get(0).getKey());
|
|
assertEquals(missingValues[i], result.getBuckets().get(0).getKey());
|
|
@@ -1003,7 +1005,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals("_name", result.getName());
|
|
assertEquals("_name", result.getName());
|
|
|
assertEquals(1, result.getBuckets().size());
|
|
assertEquals(1, result.getBuckets().size());
|
|
|
assertEquals("192.168.100.42", result.getBuckets().get(0).getKey());
|
|
assertEquals("192.168.100.42", result.getBuckets().get(0).getKey());
|
|
@@ -1051,7 +1053,7 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
aggregator.preCollection();
|
|
aggregator.preCollection();
|
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
|
|
|
aggregator.postCollection();
|
|
aggregator.postCollection();
|
|
|
- Terms result = (Terms) aggregator.buildTopLevel();
|
|
|
|
|
|
|
+ Terms result = reduce(aggregator);
|
|
|
assertEquals(3, result.getBuckets().size());
|
|
assertEquals(3, result.getBuckets().size());
|
|
|
assertEquals("a", result.getBuckets().get(0).getKeyAsString());
|
|
assertEquals("a", result.getBuckets().get(0).getKeyAsString());
|
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
assertEquals(1L, result.getBuckets().get(0).getDocCount());
|
|
@@ -1449,4 +1451,18 @@ public class TermsAggregatorTests extends AggregatorTestCase {
|
|
|
return aggregator.buildTopLevel();
|
|
return aggregator.buildTopLevel();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private <T extends InternalAggregation> T reduce(Aggregator agg) throws IOException {
|
|
|
|
|
+ // now do the final reduce
|
|
|
|
|
+ MultiBucketConsumerService.MultiBucketConsumer reduceBucketConsumer =
|
|
|
|
|
+ new MultiBucketConsumerService.MultiBucketConsumer(Integer.MAX_VALUE,
|
|
|
|
|
+ new NoneCircuitBreakerService().getBreaker(CircuitBreaker.REQUEST));
|
|
|
|
|
+ InternalAggregation.ReduceContext context = InternalAggregation.ReduceContext.forFinalReduction(
|
|
|
|
|
+ agg.context().bigArrays(), getMockScriptService(), reduceBucketConsumer, PipelineTree.EMPTY);
|
|
|
|
|
+
|
|
|
|
|
+ T topLevel = (T) agg.buildTopLevel();
|
|
|
|
|
+ T result = (T) topLevel.reduce(Collections.singletonList(topLevel), context);
|
|
|
|
|
+ doAssertReducedMultiBucketConsumer(result, reduceBucketConsumer);
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|