diff --git a/src/adapter/elasticsearch.ts b/src/adapter/elasticsearch.ts index baf7386e98358b0c9bf738d1bc9b83ec6c8cceb0..d3de47bc8c4f9b40d3c0eb1cf579b2b7141aafc0 100644 --- a/src/adapter/elasticsearch.ts +++ b/src/adapter/elasticsearch.ts @@ -1,6 +1,7 @@ import { View } from "../core/view"; import { Source } from "../core/source"; import { FilterOperator } from "../core/filter"; +import { Metric } from "../core/metric"; import { Adapter } from "../core/adapter"; import { DataType, AggregationType } from "../common/types"; import { Client, ConfigOptions } from "elasticsearch"; @@ -70,10 +71,10 @@ export class ElasticsearchAdapter extends Adapter { */ public getDataFromView(view: View, cb: (error: Error, result?: any[]) => void): void { const query = this.getQueryFromView(view); - if (view.clauses.length == 0 || view.dimensions.length > 1) { - this.executeQuery(view.operation.values[0].name, query, cb); - } else { + if (view.clauses.length > 0 || view.dimensions.length == 1) { this.executeQuery(view.operation.values[0].operation.values[0].name, query, cb); + } else { + this.executeQuery(view.operation.values[0].name, query, cb); } } @@ -129,7 +130,7 @@ export class ElasticsearchAdapter extends Adapter { let partialQuery = {}; for (let i=0; i<view.metrics.length; i++) { func = this.getAggregateFunction(view.metrics[i].aggregation); - aggrName = func + "_" + view.metrics[i].name.toLowerCase(); + aggrName = view.metrics[i].name.toLowerCase(); Object.assign(partialQuery, { [aggrName]: {[func]: {field: view.metrics[i].name}}}); } return partialQuery; @@ -137,18 +138,29 @@ export class ElasticsearchAdapter extends Adapter { let returnedQuery = this.translateAggs(view, numDimensions+1); if (view.dimensions.length > 0) { - let group_by = "group_by_" + view.dimensions[numDimensions].name; - let aggregation = { - [group_by]: { - terms: { - field: view.dimensions[numDimensions].name + ".keyword", - size: 100000 - }, - aggs: {} + let group_by = "group_by_" + view.dimensions[numDimensions].name; + let dim = view.dimensions[numDimensions].name; + if (view.dimensions[numDimensions].dataType < 3) { + dim = dim; + } else { + dim = dim + ".keyword"; + } + let aggregation = { + [group_by]: { + terms: { + field: dim, + size: 100000 + }, + aggs: {} + } + }; + + Object.assign(aggregation[group_by], {aggs: returnedQuery}); + + if (numDimensions == view.dimensions.length - 1 && view.sort.length > 0) { + let aggrName = view.sort[0].name.toLowerCase(); + Object.assign(aggregation[group_by].terms, {order: {[aggrName] : "asc"}}); } - }; - - Object.assign(aggregation[group_by], {aggs: returnedQuery}); return aggregation; }