|
22 | 22 | import java.util.ArrayList; |
23 | 23 | import java.util.Arrays; |
24 | 24 | import java.util.HashMap; |
| 25 | +import java.util.HashSet; |
25 | 26 | import java.util.Iterator; |
26 | 27 | import java.util.LinkedList; |
27 | 28 | import java.util.List; |
|
35 | 36 | import org.apache.commons.lang.StringUtils; |
36 | 37 | import org.apache.zeppelin.interpreter.Interpreter; |
37 | 38 | import org.apache.zeppelin.interpreter.InterpreterContext; |
38 | | -import org.apache.zeppelin.interpreter.InterpreterPropertyBuilder; |
39 | 39 | import org.apache.zeppelin.interpreter.InterpreterResult; |
40 | 40 | import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; |
41 | 41 | import org.elasticsearch.action.delete.DeleteResponse; |
|
48 | 48 | import org.elasticsearch.client.transport.TransportClient; |
49 | 49 | import org.elasticsearch.common.settings.Settings; |
50 | 50 | import org.elasticsearch.common.transport.InetSocketTransportAddress; |
| 51 | +import org.elasticsearch.common.xcontent.XContentBuilder; |
| 52 | +import org.elasticsearch.common.xcontent.XContentFactory; |
51 | 53 | import org.elasticsearch.common.xcontent.XContentHelper; |
52 | 54 | import org.elasticsearch.index.query.QueryBuilders; |
53 | 55 | import org.elasticsearch.search.SearchHit; |
@@ -437,14 +439,37 @@ else if (agg instanceof InternalSingleBucketAggregation) { |
437 | 439 | resMsg = XContentHelper.toString((InternalSingleBucketAggregation) agg).toString(); |
438 | 440 | } |
439 | 441 | else if (agg instanceof InternalMultiBucketAggregation) { |
440 | | - final StringBuffer buffer = new StringBuffer("key\tdoc_count"); |
441 | | - |
| 442 | + final Set<String> headerKeys = new HashSet<>(); |
| 443 | + final List<Map<String, Object>> buckets = new LinkedList<>(); |
442 | 444 | final InternalMultiBucketAggregation multiBucketAgg = (InternalMultiBucketAggregation) agg; |
| 445 | + |
443 | 446 | for (MultiBucketsAggregation.Bucket bucket : multiBucketAgg.getBuckets()) { |
444 | | - buffer.append("\n") |
445 | | - .append(bucket.getKeyAsString()) |
446 | | - .append("\t") |
447 | | - .append(bucket.getDocCount()); |
| 447 | + try { |
| 448 | + final XContentBuilder builder = XContentFactory.jsonBuilder(); |
| 449 | + bucket.toXContent(builder, null); |
| 450 | + final Map<String, Object> bucketMap = JsonFlattener.flattenAsMap(builder.string()); |
| 451 | + headerKeys.addAll(bucketMap.keySet()); |
| 452 | + buckets.add(bucketMap); |
| 453 | + } |
| 454 | + catch (IOException e) { |
| 455 | + logger.error("Processing bucket: " + e.getMessage(), e); |
| 456 | + } |
| 457 | + } |
| 458 | + |
| 459 | + final StringBuffer buffer = new StringBuffer(); |
| 460 | + final String[] keys = headerKeys.toArray(new String[0]); |
| 461 | + for (String key: keys) { |
| 462 | + buffer.append("\t" + key); |
| 463 | + } |
| 464 | + buffer.deleteCharAt(0); |
| 465 | + |
| 466 | + for (Map<String, Object> bucket : buckets) { |
| 467 | + buffer.append("\n"); |
| 468 | + |
| 469 | + for (String key: keys) { |
| 470 | + buffer.append(bucket.get(key)).append("\t"); |
| 471 | + } |
| 472 | + buffer.deleteCharAt(buffer.length() - 1); |
448 | 473 | } |
449 | 474 |
|
450 | 475 | resType = InterpreterResult.Type.TABLE; |
|
0 commit comments