You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by ri...@apache.org on 2021/08/22 14:04:32 UTC

[incubator-streampipes] 05/06: [STREAMPIPES-402] Connect data explorer widgets to new API

This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-streampipes.git

commit dbb7a9d3b2826344f0d97c9008a2a5a411de630b
Author: Dominik Riemer <ri...@fzi.de>
AuthorDate: Sun Aug 22 16:04:03 2021 +0200

    [STREAMPIPES-402] Connect data explorer widgets to new API
---
 .../datalake/DatalakeQueryParameterBuilder.ts      | 91 ++++++++++++++++++++++
 .../datalake/DatalakeQueryParameters.ts            |  3 +
 .../datadownloadDialog/dataDownload.dialog.ts      | 13 ++--
 ...data-explorer-widget-data-settings.component.ts |  9 ++-
 .../widgets/base/base-data-explorer-widget.ts      |  2 +-
 .../widgets/image/image-widget.component.ts        | 28 ++++---
 .../line-chart/line-chart-widget.component.ts      | 75 +++++++++++-------
 .../config/table-widget-config.component.html      |  7 ++
 .../widgets/table/model/table-widget.model.ts      |  8 +-
 .../widgets/table/table-widget.component.ts        | 12 ++-
 .../app/data-explorer/data-explorer.component.ts   |  2 -
 ui/src/app/data-explorer/data-explorer.module.ts   |  8 +-
 .../services/data-view-data-explorer.service.ts    | 10 +--
 .../apis/datalake-rest.service.ts                  | 17 ++--
 14 files changed, 215 insertions(+), 70 deletions(-)

diff --git a/ui/src/app/core-services/datalake/DatalakeQueryParameterBuilder.ts b/ui/src/app/core-services/datalake/DatalakeQueryParameterBuilder.ts
new file mode 100644
index 0000000..9854137
--- /dev/null
+++ b/ui/src/app/core-services/datalake/DatalakeQueryParameterBuilder.ts
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { DatalakeQueryParameters } from './DatalakeQueryParameters';
+
+export class DatalakeQueryParameterBuilder {
+
+  private queryParams: DatalakeQueryParameters;
+
+  static create(startTime: number,
+                endTime: number): DatalakeQueryParameterBuilder {
+
+    return new DatalakeQueryParameterBuilder(startTime, endTime);
+  }
+
+  private constructor(startTime: number,
+                      endTime: number) {
+    this.queryParams = new DatalakeQueryParameters();
+    this.queryParams.startDate = startTime;
+    this.queryParams.endDate = endTime;
+  }
+
+  public withAutoAggregation(aggregationFunction: string) {
+    this.queryParams.autoAggregate = true;
+    this.queryParams.aggregationFunction = aggregationFunction;
+
+    return this;
+  }
+
+  public withAggregation(aggregationFunction: string,
+                         aggregationTimeUnit: string,
+                         aggregationTimeValue: number) {
+    this.queryParams.aggregationFunction = aggregationFunction;
+    this.queryParams.timeInterval = aggregationTimeValue + aggregationTimeUnit;
+
+    return this;
+  }
+
+  public withGrouping(groupBy: string,
+                      aggregationFunction: string,
+                      aggregationTimeUnit: string,
+                      aggregationTimeValue: number): DatalakeQueryParameterBuilder {
+
+    this.queryParams.groupBy = groupBy;
+    this.queryParams.aggregationFunction = aggregationFunction;
+    this.queryParams.timeInterval = aggregationTimeValue + aggregationTimeUnit;
+
+    return this;
+  }
+
+  public withPaging(page: number,
+                    limit: number): DatalakeQueryParameterBuilder {
+    this.queryParams.page = page;
+    this.queryParams.limit = limit;
+
+    return this;
+  }
+
+  public withOffset(offset: number,
+                    limit: number): DatalakeQueryParameterBuilder {
+    this.queryParams.offset = offset;
+    this.queryParams.limit = limit;
+
+    return this;
+  }
+
+  public withColumnFilter(columns: string[]): DatalakeQueryParameterBuilder {
+    this.queryParams.columns = columns.toString();
+
+    return this;
+  }
+
+  public build(): DatalakeQueryParameters {
+    return this.queryParams;
+  }
+}
diff --git a/ui/src/app/core-services/datalake/DatalakeQueryParameters.ts b/ui/src/app/core-services/datalake/DatalakeQueryParameters.ts
index 6859b0c..f4c4fce 100644
--- a/ui/src/app/core-services/datalake/DatalakeQueryParameters.ts
+++ b/ui/src/app/core-services/datalake/DatalakeQueryParameters.ts
@@ -27,5 +27,8 @@ export class DatalakeQueryParameters {
   public order: string;
   public aggregationFunction: string;
   public timeInterval: string;
+  public countOnly: boolean;
+  public autoAggregate: boolean;
+
 }
 
diff --git a/ui/src/app/data-explorer/components/datadownloadDialog/dataDownload.dialog.ts b/ui/src/app/data-explorer/components/datadownloadDialog/dataDownload.dialog.ts
index 060e6ea..25a601c 100644
--- a/ui/src/app/data-explorer/components/datadownloadDialog/dataDownload.dialog.ts
+++ b/ui/src/app/data-explorer/components/datadownloadDialog/dataDownload.dialog.ts
@@ -16,11 +16,11 @@
  *
  */
 
-import {HttpEventType} from '@angular/common/http';
-import {Component, Inject, ViewChild} from '@angular/core';
-import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
-import {MatStepper} from '@angular/material/stepper';
-import {DatalakeRestService} from '../../../core-services/datalake/datalake-rest.service';
+import { HttpEventType } from '@angular/common/http';
+import { Component, Inject, ViewChild } from '@angular/core';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { MatStepper } from '@angular/material/stepper';
+import { DatalakeRestService } from '../../../core-services/datalake/datalake-rest.service';
 
 @Component({
     selector: 'sp-data-download-dialog',
@@ -44,7 +44,8 @@ export class DataDownloadDialog {
 
 
     constructor(public dialogRef: MatDialogRef<DataDownloadDialog>,
-                @Inject(MAT_DIALOG_DATA) public data, private restService: DatalakeRestService, ) {
+                @Inject(MAT_DIALOG_DATA) public data,
+                private restService: DatalakeRestService) {
         this.dateRange[0] = new Date();
         this.dateRange[1] = new Date(this.dateRange[0].getTime() + 60000 * 60 * 24);
     }
diff --git a/ui/src/app/data-explorer/components/designer-panel/data-settings/data-explorer-widget-data-settings.component.ts b/ui/src/app/data-explorer/components/designer-panel/data-settings/data-explorer-widget-data-settings.component.ts
index 9dfc2fd..a86571d 100644
--- a/ui/src/app/data-explorer/components/designer-panel/data-settings/data-explorer-widget-data-settings.component.ts
+++ b/ui/src/app/data-explorer/components/designer-panel/data-settings/data-explorer-widget-data-settings.component.ts
@@ -17,11 +17,14 @@
  */
 
 import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
-import { DataExplorerWidgetModel, DataLakeMeasure } from '../../../../core-model/gen/streampipes-model';
+import {
+  DataExplorerWidgetModel,
+  DataLakeMeasure
+} from '../../../../core-model/gen/streampipes-model';
 import { DataViewDataExplorerService } from '../../../services/data-view-data-explorer.service';
-import { DatalakeRestService } from '../../../../core-services/datalake/datalake-rest.service';
 import { MatSelectChange } from '@angular/material/select';
 import { Tuple2 } from '../../../../core-model/base/Tuple2';
+import { DatalakeRestService } from '../../../../platform-services/apis/datalake-rest.service';
 
 @Component({
   selector: 'sp-data-explorer-widget-data-settings',
@@ -61,7 +64,7 @@ export class DataExplorerWidgetDataSettingsComponent implements OnInit {
   }
 
   loadAvailableMeasurements() {
-    this.datalakeRestService.getAllInfos().subscribe(response => {
+    this.datalakeRestService.getAllMeasurementSeries().subscribe(response => {
       this.availableMeasurements = response;
     });
   }
diff --git a/ui/src/app/data-explorer/components/widgets/base/base-data-explorer-widget.ts b/ui/src/app/data-explorer/components/widgets/base/base-data-explorer-widget.ts
index 504bf06..23544e1 100644
--- a/ui/src/app/data-explorer/components/widgets/base/base-data-explorer-widget.ts
+++ b/ui/src/app/data-explorer/components/widgets/base/base-data-explorer-widget.ts
@@ -28,7 +28,6 @@ import {
 } from '@angular/core';
 import { MatDialog } from '@angular/material/dialog';
 import { GridsterItem, GridsterItemComponent } from 'angular-gridster2';
-import { DatalakeRestService } from '../../../../core-services/datalake/datalake-rest.service';
 import {
   DataExplorerWidgetModel,
   DataLakeMeasure,
@@ -37,6 +36,7 @@ import {
 import { WidgetConfigurationService } from '../../../services/widget-configuration.service';
 import { DashboardItem, TimeSettings } from '../../../../dashboard/models/dashboard.model';
 import { ResizeService } from '../../../services/resize.service';
+import { DatalakeRestService } from '../../../../platform-services/apis/datalake-rest.service';
 
 @Directive()
 export abstract class BaseDataExplorerWidget<T extends DataExplorerWidgetModel> implements OnInit, OnChanges, OnDestroy {
diff --git a/ui/src/app/data-explorer/components/widgets/image/image-widget.component.ts b/ui/src/app/data-explorer/components/widgets/image/image-widget.component.ts
index 2ab2a16..cec0800 100644
--- a/ui/src/app/data-explorer/components/widgets/image/image-widget.component.ts
+++ b/ui/src/app/data-explorer/components/widgets/image/image-widget.component.ts
@@ -16,16 +16,18 @@
  *
  */
 
-import {Component, OnDestroy, OnInit, ViewChild} from '@angular/core';
-import {MatSort} from '@angular/material/sort';
-import {DataResult} from '../../../../core-model/datalake/DataResult';
-import {DatalakeRestService} from '../../../../core-services/datalake/datalake-rest.service';
-import {BaseDataExplorerWidget} from '../base/base-data-explorer-widget';
-import {MatDialog} from '@angular/material/dialog';
-import {EventPropertyUnion, EventSchema} from '../../../../core-model/gen/streampipes-model';
-import {ImageWidgetModel} from "./model/image-widget.model";
-import {WidgetConfigurationService} from "../../../services/widget-configuration.service";
+import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
+import { MatSort } from '@angular/material/sort';
+import { DataResult } from '../../../../core-model/datalake/DataResult';
+import { BaseDataExplorerWidget } from '../base/base-data-explorer-widget';
+import { MatDialog } from '@angular/material/dialog';
+import { EventPropertyUnion, EventSchema } from '../../../../core-model/gen/streampipes-model';
+import { ImageWidgetModel } from './model/image-widget.model';
+import { WidgetConfigurationService } from '../../../services/widget-configuration.service';
 import { ResizeService } from '../../../services/resize.service';
+import { DatalakeRestService } from '../../../../platform-services/apis/datalake-rest.service';
+import { DatalakeQueryParameters } from '../../../../core-services/datalake/DatalakeQueryParameters';
+import { DatalakeQueryParameterBuilder } from '../../../../core-services/datalake/DatalakeQueryParameterBuilder';
 
 @Component({
   selector: 'sp-data-explorer-image-widget',
@@ -74,8 +76,8 @@ export class ImageWidgetComponent extends BaseDataExplorerWidget<ImageWidgetMode
   refreshData() {
     this.setShownComponents(false, false, true);
 
-    this.dataLakeRestService.getDataAutoAggregation(
-        this.dataLakeMeasure.measureName, this.timeSettings.startTime, this.timeSettings.endTime)
+    this.dataLakeRestService.getData(
+        this.dataLakeMeasure.measureName, this.buildQuery())
         .subscribe(
             (res: DataResult) => {
               // this.availableImageData = res;
@@ -93,4 +95,8 @@ export class ImageWidgetComponent extends BaseDataExplorerWidget<ImageWidgetMode
 
   refreshView() {
   }
+
+  buildQuery(): DatalakeQueryParameters {
+    return DatalakeQueryParameterBuilder.create(this.timeSettings.startTime, this.timeSettings.endTime).build();
+  }
 }
diff --git a/ui/src/app/data-explorer/components/widgets/line-chart/line-chart-widget.component.ts b/ui/src/app/data-explorer/components/widgets/line-chart/line-chart-widget.component.ts
index 3ad9196..36a0aec 100644
--- a/ui/src/app/data-explorer/components/widgets/line-chart/line-chart-widget.component.ts
+++ b/ui/src/app/data-explorer/components/widgets/line-chart/line-chart-widget.component.ts
@@ -20,7 +20,6 @@ import { Component, OnInit, Renderer2 } from '@angular/core';
 import { MatDialog } from '@angular/material/dialog';
 import { DataResult } from '../../../../core-model/datalake/DataResult';
 import { GroupedDataResult } from '../../../../core-model/datalake/GroupedDataResult';
-import { DatalakeRestService } from '../../../../core-services/datalake/datalake-rest.service';
 import { ColorService } from './services/color.service';
 import { BaseDataExplorerWidget } from '../base/base-data-explorer-widget';
 import { Label } from '../../../../core-model/gen/streampipes-model';
@@ -28,6 +27,9 @@ import { ResizeService } from '../../../services/resize.service';
 import { LabelService } from '../../../../core-ui/labels/services/label.service';
 import { LineChartWidgetModel } from './model/line-chart-widget.model';
 import { WidgetConfigurationService } from '../../../services/widget-configuration.service';
+import { DatalakeRestService } from '../../../../platform-services/apis/datalake-rest.service';
+import { DatalakeQueryParameters } from '../../../../core-services/datalake/DatalakeQueryParameters';
+import { DatalakeQueryParameterBuilder } from '../../../../core-services/datalake/DatalakeQueryParameterBuilder';
 
 @Component({
   selector: 'sp-data-explorer-line-chart-widget',
@@ -123,14 +125,14 @@ export class LineChartWidgetComponent extends BaseDataExplorerWidget<LineChartWi
         }
       ],
       direction: 'left',
-      pad: { 'r': 10, 't': 10 },
+      pad: {'r': 10, 't': 10},
       showactive: true,
       type: 'buttons',
       x: 0.0,
       xanchor: 'left',
       y: 1.3,
       yanchor: 'top',
-      font: { color: this.dataExplorerWidget.baseAppearanceConfig.textColor },
+      font: {color: this.dataExplorerWidget.baseAppearanceConfig.textColor},
       bgcolor: this.dataExplorerWidget.baseAppearanceConfig.backgroundColor,
       bordercolor: '#000'
     }];
@@ -178,7 +180,7 @@ export class LineChartWidgetComponent extends BaseDataExplorerWidget<LineChartWi
       this.data = this.displayGroupedData(tmp);
 
       if (this.data !== undefined &&
-        this.data['colorPropertyStringValues'] !== undefined && this.data['colorPropertyStringValues'].length > 0) {
+          this.data['colorPropertyStringValues'] !== undefined && this.data['colorPropertyStringValues'].length > 0) {
         this.addInitialColouredShapesToGraph(this.colorPropertyStringValues, this.colorService.getColor);
       }
 
@@ -470,7 +472,7 @@ export class LineChartWidgetComponent extends BaseDataExplorerWidget<LineChartWi
 
         // fetching path of labeling button icon
         const path = modeBarButtons[i].getElementsByClassName('icon').item(0)
-          .getElementsByTagName('path').item(0);
+            .getElementsByTagName('path').item(0);
 
         // adding 'clicked' to class list
         modeBarButtons[i].classList.add('clicked');
@@ -495,7 +497,7 @@ export class LineChartWidgetComponent extends BaseDataExplorerWidget<LineChartWi
 
         // fetching path of labeling button icon
         const path = modeBarButtons[i].getElementsByClassName('icon').item(0)
-          .getElementsByTagName('path').item(0);
+            .getElementsByTagName('path').item(0);
 
         // removing 'clicked' from class list
         modeBarButtons[i].classList.remove('clicked');
@@ -515,19 +517,19 @@ export class LineChartWidgetComponent extends BaseDataExplorerWidget<LineChartWi
     const startdate = new Date(start_X).getTime() - 1;
     const enddate = new Date(end_X).getTime() + 1;
 
-    this.dataLakeRestService.saveLabelsInDatabase(
-      this.data['measureName'],
-      'sp_internal_label',
-      startdate,
-      enddate,
-      label,
-      this.dataExplorerWidget.dataConfig.xKey
-    ).subscribe(
-      res => {
-        // TODO add pop up similar to images
-        // console.log('Successfully wrote label ' + currentLabel + ' into database.');
-      }
-    );
+    // this.dataLakeRestService.saveLabelsInDatabase(
+    //     this.data['measureName'],
+    //     'sp_internal_label',
+    //     startdate,
+    //     enddate,
+    //     label,
+    //     this.dataExplorerWidget.dataConfig.xKey
+    // ).subscribe(
+    //     res => {
+    //       // TODO add pop up similar to images
+    //       // console.log('Successfully wrote label ' + currentLabel + ' into database.');
+    //     }
+    // );
   }
 
   private addInitialColouredShapesToGraph(newColorPropertyStringValues, getColor) {
@@ -641,20 +643,19 @@ export class LineChartWidgetComponent extends BaseDataExplorerWidget<LineChartWi
     this.graph.layout.shapes = [];
     if (!this.advancedSettingsActive) {
       this.setShownComponents(false, false, true);
-      this.dataLakeRestService.getDataAutoAggregation(
-        this.dataLakeMeasure.measureName, this.timeSettings.startTime, this.timeSettings.endTime)
-        .subscribe((res: DataResult) => {
-          this.processNonGroupedData(res);
-        });
+      this.dataLakeRestService.getData(
+          this.dataLakeMeasure.measureName, this.buildQuery())
+          .subscribe((res: DataResult) => {
+            this.processNonGroupedData(res);
+          });
     } else {
       if (this.dataExplorerWidget.dataConfig.groupValue === 'None') {
         this.setShownComponents(false, false, true);
         this.dataLakeRestService.getData(
-          this.dataLakeMeasure.measureName, this.timeSettings.startTime, this.timeSettings.endTime,
-          this.dataExplorerWidget.dataConfig.aggregationTimeUnit, this.dataExplorerWidget.dataConfig.aggregationValue)
-          .subscribe((res: DataResult) => {
-            this.processNonGroupedData(res);
-          });
+            this.dataLakeMeasure.measureName, this.buildAggregationQuery())
+            .subscribe((res: DataResult) => {
+              this.processNonGroupedData(res);
+            });
       } else {
         // this.dataLakeRestService.getGroupedData(
         //   this.dataExplorerWidget.dataLakeMeasure.measureName, this.viewDateRange.startDate.getTime(), this.viewDateRange.endDate.getTime(),
@@ -682,4 +683,20 @@ export class LineChartWidgetComponent extends BaseDataExplorerWidget<LineChartWi
     }
     //this.toggleLabelingMode();
   }
+
+  buildQuery(): DatalakeQueryParameters {
+    return DatalakeQueryParameterBuilder
+        .create(this.timeSettings.startTime, this.timeSettings.endTime)
+        .withAutoAggregation('FIRST')
+        .build();
+  }
+
+  buildAggregationQuery(): DatalakeQueryParameters {
+    return DatalakeQueryParameterBuilder
+        .create(this.timeSettings.startTime, this.timeSettings.endTime)
+        .withPaging(1, 100)
+        .withGrouping(undefined, undefined,
+            this.dataExplorerWidget.dataConfig.aggregationTimeUnit, this.dataExplorerWidget.dataConfig.aggregationValue)
+        .build();
+  }
 }
diff --git a/ui/src/app/data-explorer/components/widgets/table/config/table-widget-config.component.html b/ui/src/app/data-explorer/components/widgets/table/config/table-widget-config.component.html
index b859db8..0dd6270 100644
--- a/ui/src/app/data-explorer/components/widgets/table/config/table-widget-config.component.html
+++ b/ui/src/app/data-explorer/components/widgets/table/config/table-widget-config.component.html
@@ -31,5 +31,12 @@
             [availableProperties]="currentlyConfiguredWidget.dataConfig.availableColumns"
             [selectedProperties]="currentlyConfiguredWidget.dataConfig.selectedColumns">
     </sp-select-properties>
+
+    <mat-form-field fxFlex="100" color="accent">
+        <mat-label>
+            <mat-icon>search</mat-icon>
+            <span>&nbsp;Limit</span></mat-label>
+        <input [(ngModel)]="currentlyConfiguredWidget.dataConfig.limit" matInput (input)="onFilterChange($event.target.value)">
+    </mat-form-field>
 </div>
 
diff --git a/ui/src/app/data-explorer/components/widgets/table/model/table-widget.model.ts b/ui/src/app/data-explorer/components/widgets/table/model/table-widget.model.ts
index 268e03c..8e22145 100644
--- a/ui/src/app/data-explorer/components/widgets/table/model/table-widget.model.ts
+++ b/ui/src/app/data-explorer/components/widgets/table/model/table-widget.model.ts
@@ -16,13 +16,19 @@
  *
  */
 
-import { DataExplorerWidgetModel, EventPropertyUnion } from '../../../../../core-model/gen/streampipes-model';
+import {
+  DataExplorerWidgetModel,
+  EventPropertyUnion
+} from '../../../../../core-model/gen/streampipes-model';
 
 export interface TableDataConfig {
   availableColumns: EventPropertyUnion[];
   selectedColumns: EventPropertyUnion[];
   searchValue: string;
   columnNames: string[];
+  page: number;
+  limit: number;
+  offset: number;
 }
 
 export interface TableWidgetModel extends DataExplorerWidgetModel {
diff --git a/ui/src/app/data-explorer/components/widgets/table/table-widget.component.ts b/ui/src/app/data-explorer/components/widgets/table/table-widget.component.ts
index 4187022..ab31955 100644
--- a/ui/src/app/data-explorer/components/widgets/table/table-widget.component.ts
+++ b/ui/src/app/data-explorer/components/widgets/table/table-widget.component.ts
@@ -25,7 +25,9 @@ import { BaseDataExplorerWidget } from '../base/base-data-explorer-widget';
 import { WidgetConfigurationService } from '../../../services/widget-configuration.service';
 import { TableWidgetModel } from './model/table-widget.model';
 import { ResizeService } from '../../../services/resize.service';
-import { DatalakeRestService } from '../../../../core-services/datalake/datalake-rest.service';
+import { DatalakeRestService } from '../../../../platform-services/apis/datalake-rest.service';
+import { DatalakeQueryParameters } from '../../../../core-services/datalake/DatalakeQueryParameters';
+import { DatalakeQueryParameterBuilder } from '../../../../core-services/datalake/DatalakeQueryParameterBuilder';
 
 @Component({
   selector: 'sp-data-explorer-table-widget',
@@ -100,8 +102,8 @@ export class TableWidgetComponent extends BaseDataExplorerWidget<TableWidgetMode
   public refreshData() {
     this.setShownComponents(false, false, true);
 
-    this.dataLakeRestService.getDataAutoAggregation(
-      this.dataLakeMeasure.measureName, this.timeSettings.startTime, this.timeSettings.endTime)
+    this.dataLakeRestService.getData(
+      this.dataLakeMeasure.measureName, this.buildQuery())
       .subscribe(
         (res: DataResult) => {
           this.dataSource.data = this.transformData(res);
@@ -113,4 +115,8 @@ export class TableWidgetComponent extends BaseDataExplorerWidget<TableWidgetMode
     this.dataSource.filter = this.dataExplorerWidget.dataConfig.searchValue;
   }
 
+  buildQuery(): DatalakeQueryParameters {
+    return DatalakeQueryParameterBuilder.create(this.timeSettings.startTime, this.timeSettings.endTime).build();
+  }
+
 }
diff --git a/ui/src/app/data-explorer/data-explorer.component.ts b/ui/src/app/data-explorer/data-explorer.component.ts
index ac5c66d..9333daa 100644
--- a/ui/src/app/data-explorer/data-explorer.component.ts
+++ b/ui/src/app/data-explorer/data-explorer.component.ts
@@ -23,7 +23,6 @@ import { DataExplorerDashboardPanelComponent } from './components/panel/data-exp
 import { Dashboard, TimeSettings } from '../dashboard/models/dashboard.model';
 import { Tuple2 } from '../core-model/base/Tuple2';
 import { ActivatedRoute } from '@angular/router';
-import { TimeRangeSelectorComponent } from './components/time-selector/timeRangeSelector.component';
 
 @Component({
   selector: 'sp-data-explorer',
@@ -54,7 +53,6 @@ export class DataExplorerComponent implements OnInit {
   public ngOnInit() {
     this.route.queryParams.subscribe(params => {
       this.routeParams = {startTime: params['startTime'], endTime: params['endTime'], dashboardId: params['dashboardId']};
-      console.log(this.routeParams);
       this.getDashboards();
     });
     this.refreshDashboardService.refreshSubject.subscribe(currentDashboardId => {
diff --git a/ui/src/app/data-explorer/data-explorer.module.ts b/ui/src/app/data-explorer/data-explorer.module.ts
index 9025740..535ab6b 100644
--- a/ui/src/app/data-explorer/data-explorer.module.ts
+++ b/ui/src/app/data-explorer/data-explorer.module.ts
@@ -29,12 +29,15 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
 import { MatSliderModule } from '@angular/material/slider';
 import { MatSnackBarModule } from '@angular/material/snack-bar';
 import { MatTabsModule } from '@angular/material/tabs';
-import { OWL_DATE_TIME_FORMATS, OwlDateTimeModule, OwlNativeDateTimeModule } from '@danielmoncada/angular-datetime-picker';
+import {
+  OWL_DATE_TIME_FORMATS,
+  OwlDateTimeModule,
+  OwlNativeDateTimeModule
+} from '@danielmoncada/angular-datetime-picker';
 import { NgxChartsModule } from '@swimlane/ngx-charts';
 import { GridsterModule } from 'angular-gridster2';
 import { PlotlyViaWindowModule } from 'angular-plotly.js';
 import { ColorPickerModule } from 'ngx-color-picker';
-import { DatalakeRestService } from '../core-services/datalake/datalake-rest.service';
 import { SemanticTypeUtilsService } from '../core-services/semantic-type/semantic-type-utils.service';
 import { SharedDatalakeRestService } from '../core-services/shared/shared-dashboard.service';
 import { CoreUiModule } from '../core-ui/core-ui.module';
@@ -67,6 +70,7 @@ import { DataExplorerWidgetDataSettingsComponent } from './components/designer-p
 import { WidgetConfigurationService } from './services/widget-configuration.service';
 import { LineChartWidgetConfigComponent } from './components/widgets/line-chart/config/line-chart-widget-config.component';
 import { ImageWidgetConfigComponent } from './components/widgets/image/config/image-widget-config.component';
+import { DatalakeRestService } from '../platform-services/apis/datalake-rest.service';
 
 const dashboardWidgets = [];
 
diff --git a/ui/src/app/data-explorer/services/data-view-data-explorer.service.ts b/ui/src/app/data-explorer/services/data-view-data-explorer.service.ts
index 876d997..e8a7100 100644
--- a/ui/src/app/data-explorer/services/data-view-data-explorer.service.ts
+++ b/ui/src/app/data-explorer/services/data-view-data-explorer.service.ts
@@ -19,15 +19,12 @@
 import { HttpClient } from '@angular/common/http';
 import { Observable } from 'rxjs';
 import { map } from 'rxjs/operators';
-import { DatalakeRestService } from '../../core-services/datalake/datalake-rest.service';
 import { SharedDatalakeRestService } from '../../core-services/shared/shared-dashboard.service';
 import { AuthStatusService } from '../../services/auth-status.service';
-import {
-  DataExplorerWidgetModel,
-  DataLakeMeasure,
-} from '../../core-model/gen/streampipes-model';
+import { DataExplorerWidgetModel, DataLakeMeasure, } from '../../core-model/gen/streampipes-model';
 import { Dashboard } from '../../dashboard/models/dashboard.model';
 import { Injectable } from '@angular/core';
+import { DatalakeRestService } from '../../platform-services/apis/datalake-rest.service';
 
 
 @Injectable()
@@ -42,8 +39,7 @@ export class DataViewDataExplorerService {
   }
 
   getVisualizableData(): Observable<DataLakeMeasure[]> {
-
-    return this.dataLakeRestService.getAllInfos().pipe(map(data => {
+    return this.dataLakeRestService.getAllMeasurementSeries().pipe(map(data => {
       return (data as any[]).map(d => DataLakeMeasure.fromData(d as DataLakeMeasure));
     }));
   }
diff --git a/ui/src/app/platform-services/apis/datalake-rest.service.ts b/ui/src/app/platform-services/apis/datalake-rest.service.ts
index d8cfd0d..2b4857d 100644
--- a/ui/src/app/platform-services/apis/datalake-rest.service.ts
+++ b/ui/src/app/platform-services/apis/datalake-rest.service.ts
@@ -48,17 +48,24 @@ export class DatalakeRestService {
         }));
     }
 
-    getData(index, startDate, endDate, columns, aggregationFunction, aggregationTimeUnit, aggregationTimeValue): Observable<DataResult> {
+    getData(index: string,
+            queryParams: DatalakeQueryParameters): Observable<DataResult> {
         const url = this.dataLakeUrl + '/measurements/' + index;
-        const timeInterval = aggregationTimeValue + aggregationTimeUnit;
-
-        const queryParams: DatalakeQueryParameters = this.getQueryParameters(columns, startDate, endDate, undefined, undefined,
-            undefined, undefined, undefined, aggregationFunction, timeInterval);
 
         // @ts-ignore
         return this.http.get<DataResult>(url, {params: queryParams});
     }
 
+    // getData(index, startDate, endDate, columns, aggregationFunction, aggregationTimeUnit, aggregationTimeValue): Observable<DataResult> {
+    //     const timeInterval = aggregationTimeValue + aggregationTimeUnit;
+    //
+    //     const queryParams: DatalakeQueryParameters = this.getQueryParameters(columns, startDate, endDate, undefined, undefined,
+    //         undefined, undefined, undefined, aggregationFunction, timeInterval);
+    //
+    //     // @ts-ignore
+    //     return this.http.get<DataResult>(url, {params: queryParams});
+    // }
+
     getPagedData(index: string, itemsPerPage: number, page: number, columns?: string, order?: string): Observable<PageResult> {
         const url = this.dataLakeUrl + '/measurements/' + index;