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

riemer pushed a commit to branch load-dashboard-in-single-request
in repository https://gitbox.apache.org/repos/asf/streampipes.git

commit cb20a331556949a7f3aa833d7bd4d3a547be25a0
Author: Dominik Riemer <[email protected]>
AuthorDate: Tue Aug 5 11:02:18 2025 +0200

    chore: Add API to load dashboard resources in a single request
---
 .../model/dashboard/CompositeDashboardModel.java   | 15 +++---
 .../model/datalake/DataExplorerWidgetModel.java    | 20 -------
 .../manager/setup/CouchDbInstallationStep.java     |  6 +++
 .../setup/tasks/AddDataLakeMeasureViewTask.java    | 49 +++++++++++++++++
 .../management/DataExplorerResourceManager.java    | 31 +++++++++++
 .../impl/dashboard/DataLakeDashboardResource.java  | 11 +++-
 .../core/migrations/AvailableMigrations.java       |  4 +-
 .../v0980/AddDataLakeMeasureViewMigration.java     | 61 ++++++++++++++++++++++
 .../storage/api/IDataLakeMeasureStorage.java       | 12 ++---
 .../streampipes/storage/api/INoSqlStorage.java     |  3 +-
 .../storage/couchdb/CouchDbStorageManager.java     |  8 +--
 .../couchdb/impl/DataLakeMeasureStorage.java       | 60 +++++++++++++++++++++
 .../streampipes/storage/couchdb/utils/Utils.java   |  1 +
 13 files changed, 239 insertions(+), 42 deletions(-)

diff --git 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
 
b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/CompositeDashboardModel.java
similarity index 65%
copy from 
streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
copy to 
streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/CompositeDashboardModel.java
index 38cca4a759..cb06527e42 100644
--- 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
+++ 
b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/CompositeDashboardModel.java
@@ -15,14 +15,15 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.resource.management;
 
-import org.apache.streampipes.model.dashboard.DashboardModel;
-import org.apache.streampipes.storage.management.StorageDispatcher;
+package org.apache.streampipes.model.dashboard;
 
-public class DataExplorerResourceManager extends 
AbstractCRUDResourceManager<DashboardModel> {
+import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
+import org.apache.streampipes.model.datalake.DataLakeMeasure;
 
-  public DataExplorerResourceManager() {
-    
super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerDashboardStorage(),
 DashboardModel.class);
-  }
+import java.util.List;
+
+public record CompositeDashboardModel(DashboardModel dashboard,
+                                      List<DataExplorerWidgetModel> widgets,
+                                      List<DataLakeMeasure> dataLakeMeasures) {
 }
diff --git 
a/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java
 
b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java
index 8e302ae163..af5d2739c9 100644
--- 
a/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java
+++ 
b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java
@@ -45,10 +45,6 @@ public class DataExplorerWidgetModel extends DashboardEntity 
{
   @JsonSerialize(using = CustomMapSerializer.class, as = Map.class)
   private Map<String, Object> timeSettings;
 
-  private String pipelineId;
-  private String measureName;
-
-
   public DataExplorerWidgetModel() {
     super();
     this.baseAppearanceConfig = new HashMap<>();
@@ -97,22 +93,6 @@ public class DataExplorerWidgetModel extends DashboardEntity 
{
     this.dataConfig = dataConfig;
   }
 
-  public String getPipelineId() {
-    return pipelineId;
-  }
-
-  public void setPipelineId(String pipelineId) {
-    this.pipelineId = pipelineId;
-  }
-
-  public String getMeasureName() {
-    return measureName;
-  }
-
-  public void setMeasureName(String measureName) {
-    this.measureName = measureName;
-  }
-
   public Map<String, Object> getTimeSettings() {
     return this.timeSettings;
   }
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/CouchDbInstallationStep.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/CouchDbInstallationStep.java
index e1e305e4a9..1e627973c6 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/CouchDbInstallationStep.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/CouchDbInstallationStep.java
@@ -19,6 +19,7 @@
 package org.apache.streampipes.manager.setup;
 
 import org.apache.streampipes.manager.setup.design.UserDesignDocument;
+import org.apache.streampipes.manager.setup.tasks.AddDataLakeMeasureViewTask;
 import 
org.apache.streampipes.manager.setup.tasks.AddDefaultPipelineTemplatesTask;
 import org.apache.streampipes.manager.setup.tasks.CreateAssetLinkTypeTask;
 import org.apache.streampipes.manager.setup.tasks.CreateDefaultAssetTask;
@@ -77,6 +78,7 @@ public class CouchDbInstallationStep extends InstallationStep 
{
     addUserView();
     addNotificationView();
     addPipelineView();
+    addDataLakeMeasureView();
   }
 
   private void addNotificationView() {
@@ -168,4 +170,8 @@ public class CouchDbInstallationStep extends 
InstallationStep {
       logFailure(PREPARING_USERS_TEXT, e);
     }
   }
+
+  private void addDataLakeMeasureView() {
+    new AddDataLakeMeasureViewTask().execute();
+  }
 }
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/tasks/AddDataLakeMeasureViewTask.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/tasks/AddDataLakeMeasureViewTask.java
new file mode 100644
index 0000000000..4ce055c6e7
--- /dev/null
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/setup/tasks/AddDataLakeMeasureViewTask.java
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ *
+ */
+
+package org.apache.streampipes.manager.setup.tasks;
+
+import org.apache.streampipes.storage.couchdb.utils.Utils;
+
+import org.lightcouch.DesignDocument;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static 
org.apache.streampipes.manager.setup.design.DesignDocumentUtils.prepareDocument;
+
+public class AddDataLakeMeasureViewTask implements InstallationTask {
+
+  public static final String MEASUREMENT_BY_NAME_VIEW = "_design/measurement";
+
+  public static final String VIEW_NAME = "by-measure-name";
+  public static final String MAP_FUNCTION = "function (doc) { if 
(doc.measureName) { emit(doc.measureName, doc); } }";
+
+  @Override
+  public void execute() {
+    DesignDocument dataLakeDoc = prepareDocument(MEASUREMENT_BY_NAME_VIEW);
+    Map<String, DesignDocument.MapReduce> dataLakeMeasureViews = new 
HashMap<>();
+
+    DesignDocument.MapReduce byNameFn = new DesignDocument.MapReduce();
+    byNameFn.setMap(MAP_FUNCTION);
+
+    dataLakeMeasureViews.put(VIEW_NAME, byNameFn);
+    dataLakeDoc.setViews(dataLakeMeasureViews);
+    
Utils.getCouchDbGsonClient(Utils.DATA_LAKE_DB_NAME).design().synchronizeWithDb(dataLakeDoc);
+  }
+}
diff --git 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
 
b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
index 38cca4a759..06edb30d5c 100644
--- 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
+++ 
b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
@@ -17,12 +17,43 @@
  */
 package org.apache.streampipes.resource.management;
 
+import org.apache.streampipes.model.dashboard.CompositeDashboardModel;
 import org.apache.streampipes.model.dashboard.DashboardModel;
+import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
+import org.apache.streampipes.storage.api.CRUDStorage;
+import org.apache.streampipes.storage.api.IDataLakeMeasureStorage;
 import org.apache.streampipes.storage.management.StorageDispatcher;
 
+import java.util.List;
+import java.util.Map;
+
 public class DataExplorerResourceManager extends 
AbstractCRUDResourceManager<DashboardModel> {
 
+  private final CRUDStorage<DataExplorerWidgetModel> widgetStorage;
+  private final IDataLakeMeasureStorage dataLakeMeasureStorage;
+
   public DataExplorerResourceManager() {
     
super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerDashboardStorage(),
 DashboardModel.class);
+    this.widgetStorage = 
StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerWidgetStorage();
+    this.dataLakeMeasureStorage = 
StorageDispatcher.INSTANCE.getNoSqlStore().getDataLakeStorage();
+  }
+
+  public CompositeDashboardModel getCompositeDashboard(String dashboardId) {
+    var dashboard = db.getElementById(dashboardId);
+    var widgets = dashboard.getWidgets().stream().map(w -> 
widgetStorage.getElementById(w.getId())).toList();
+    var dataLakeMeasures = 
getMeasureNames(widgets).stream().map(dataLakeMeasureStorage::getByMeasureName).toList();
+
+    return new CompositeDashboardModel(dashboard, widgets, dataLakeMeasures);
+  }
+
+  private List<String> getMeasureNames(List<DataExplorerWidgetModel> widgets) {
+    return widgets.stream().map(DataExplorerWidgetModel::getDataConfig)
+        .map(dataConfig -> (List<?>) ((Map<?, ?>) 
dataConfig).get("sourceConfigs"))
+        .filter(Map.class::isInstance)
+        .map(Map.class::cast)
+        .map(cfg -> cfg.get("measureName"))
+        .filter(String.class::isInstance)
+        .map(String.class::cast)
+        .toList();
   }
 }
diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
index 75eaded908..38f6f72177 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DataLakeDashboardResource.java
@@ -20,8 +20,9 @@ package org.apache.streampipes.rest.impl.dashboard;
 
 
 import org.apache.streampipes.model.client.user.DefaultPrivilege;
+import org.apache.streampipes.model.dashboard.CompositeDashboardModel;
 import org.apache.streampipes.model.dashboard.DashboardModel;
-import org.apache.streampipes.resource.management.AbstractCRUDResourceManager;
+import org.apache.streampipes.resource.management.DataExplorerResourceManager;
 import 
org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
 
 import org.springframework.http.MediaType;
@@ -56,6 +57,12 @@ public class DataLakeDashboardResource extends 
AbstractAuthGuardedRestResource {
     return getResourceManager().find(dashboardId);
   }
 
+  @GetMapping(path = "/{dashboardId}/full", produces = 
MediaType.APPLICATION_JSON_VALUE)
+  @PreAuthorize("this.hasReadAuthority() and hasPermission(#dashboardId, 
'READ')")
+  public CompositeDashboardModel 
getCompositeDashboardModel(@PathVariable("dashboardId") String dashboardId) {
+    return getResourceManager().getCompositeDashboard(dashboardId);
+  }
+
   @PutMapping(path = "/{dashboardId}", produces = 
MediaType.APPLICATION_JSON_VALUE)
   @PreAuthorize("this.hasWriteAuthority() and 
hasPermission(#dashboardModel.couchDbId, 'WRITE')")
   public ResponseEntity<DashboardModel> modifyDashboard(@RequestBody 
DashboardModel dashboardModel) {
@@ -77,7 +84,7 @@ public class DataLakeDashboardResource extends 
AbstractAuthGuardedRestResource {
     return ok();
   }
 
-  private AbstractCRUDResourceManager<DashboardModel> getResourceManager() {
+  private DataExplorerResourceManager getResourceManager() {
     return getSpResourceManager().manageDataExplorer();
   }
 
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
index e5e79b786c..b547059f59 100644
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
+++ 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
@@ -26,6 +26,7 @@ import 
org.apache.streampipes.service.core.migrations.v090.UpdateUsernameViewMig
 import org.apache.streampipes.service.core.migrations.v093.AdapterMigration;
 import 
org.apache.streampipes.service.core.migrations.v093.StoreEmailTemplatesMigration;
 import 
org.apache.streampipes.service.core.migrations.v095.MergeFilenamesAndRenameDuplicatesMigration;
+import 
org.apache.streampipes.service.core.migrations.v0980.AddDataLakeMeasureViewMigration;
 import 
org.apache.streampipes.service.core.migrations.v0980.ModifyAssetLinkTypesMigration;
 import 
org.apache.streampipes.service.core.migrations.v0980.ModifyAssetLinksMigration;
 import 
org.apache.streampipes.service.core.migrations.v970.AddDataLakePipelineTemplateMigration;
@@ -56,7 +57,8 @@ public class AvailableMigrations {
         new AddRolesToUserDbMigration(),
         new AddDataLakePipelineTemplateMigration(),
         new ModifyAssetLinksMigration(),
-        new ModifyAssetLinkTypesMigration()
+        new ModifyAssetLinkTypesMigration(),
+        new AddDataLakeMeasureViewMigration()
     );
   }
 }
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/AddDataLakeMeasureViewMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/AddDataLakeMeasureViewMigration.java
new file mode 100644
index 0000000000..640f132c69
--- /dev/null
+++ 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v0980/AddDataLakeMeasureViewMigration.java
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ *
+ */
+
+package org.apache.streampipes.service.core.migrations.v0980;
+
+import org.apache.streampipes.manager.setup.tasks.AddDataLakeMeasureViewTask;
+import org.apache.streampipes.service.core.migrations.Migration;
+import org.apache.streampipes.storage.couchdb.utils.Utils;
+
+import org.lightcouch.NoDocumentException;
+
+import java.io.IOException;
+
+public class AddDataLakeMeasureViewMigration implements Migration {
+
+  @Override
+  public boolean shouldExecute() {
+    try {
+      var designDoc = Utils
+          .getCouchDbGsonClient(Utils.DATA_LAKE_DB_NAME)
+          .design()
+          .getFromDb(AddDataLakeMeasureViewTask.MEASUREMENT_BY_NAME_VIEW);
+      var viewKey = AddDataLakeMeasureViewTask.VIEW_NAME;
+      var viewMapFunction = AddDataLakeMeasureViewTask.MAP_FUNCTION;
+      var views = designDoc.getViews();
+
+      if (views.containsKey(viewKey)) {
+        return !(views.get(viewKey).getMap().equals(viewMapFunction));
+      } else {
+        return true;
+      }
+    } catch (NoDocumentException e) {
+      return true;
+    }
+  }
+
+  @Override
+  public void executeMigration() throws IOException {
+    new AddDataLakeMeasureViewTask().execute();
+  }
+
+  @Override
+  public String getDescription() {
+    return "Creating view for data lake measure database";
+  }
+}
diff --git 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
 
b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataLakeMeasureStorage.java
similarity index 65%
copy from 
streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
copy to 
streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataLakeMeasureStorage.java
index 38cca4a759..cab2575714 100644
--- 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/DataExplorerResourceManager.java
+++ 
b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/IDataLakeMeasureStorage.java
@@ -15,14 +15,12 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.resource.management;
 
-import org.apache.streampipes.model.dashboard.DashboardModel;
-import org.apache.streampipes.storage.management.StorageDispatcher;
+package org.apache.streampipes.storage.api;
 
-public class DataExplorerResourceManager extends 
AbstractCRUDResourceManager<DashboardModel> {
+import org.apache.streampipes.model.datalake.DataLakeMeasure;
 
-  public DataExplorerResourceManager() {
-    
super(StorageDispatcher.INSTANCE.getNoSqlStore().getDataExplorerDashboardStorage(),
 DashboardModel.class);
-  }
+public interface IDataLakeMeasureStorage extends CRUDStorage<DataLakeMeasure> {
+
+  DataLakeMeasure getByMeasureName(String measureName);
 }
diff --git 
a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/INoSqlStorage.java
 
b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/INoSqlStorage.java
index 742adf1409..ec330a4a7e 100644
--- 
a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/INoSqlStorage.java
+++ 
b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/INoSqlStorage.java
@@ -24,7 +24,6 @@ import org.apache.streampipes.model.client.user.Role;
 import org.apache.streampipes.model.client.user.UserActivationToken;
 import org.apache.streampipes.model.dashboard.DashboardModel;
 import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
-import org.apache.streampipes.model.datalake.DataLakeMeasure;
 import 
org.apache.streampipes.model.extensions.configuration.SpServiceConfiguration;
 import 
org.apache.streampipes.model.extensions.svcdiscovery.SpServiceRegistration;
 import org.apache.streampipes.model.file.FileMetadata;
@@ -48,7 +47,7 @@ public interface INoSqlStorage {
 
   INotificationStorage getNotificationStorageApi();
 
-  CRUDStorage<DataLakeMeasure> getDataLakeStorage();
+  IDataLakeMeasureStorage getDataLakeStorage();
 
   CRUDStorage<FileMetadata> getFileMetadataStorage();
 
diff --git 
a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
 
b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
index c6edb2cfcf..ea54cf6e0a 100644
--- 
a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
+++ 
b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/CouchDbStorageManager.java
@@ -31,6 +31,7 @@ import org.apache.streampipes.model.file.FileMetadata;
 import org.apache.streampipes.model.template.CompactPipelineTemplate;
 import org.apache.streampipes.storage.api.CRUDStorage;
 import org.apache.streampipes.storage.api.IAdapterStorage;
+import org.apache.streampipes.storage.api.IDataLakeMeasureStorage;
 import org.apache.streampipes.storage.api.IDataProcessorStorage;
 import org.apache.streampipes.storage.api.IDataSinkStorage;
 import org.apache.streampipes.storage.api.IDataStreamStorage;
@@ -48,6 +49,7 @@ import org.apache.streampipes.storage.api.IUserStorage;
 import 
org.apache.streampipes.storage.couchdb.impl.AdapterDescriptionStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.AdapterInstanceStorageImpl;
 import 
org.apache.streampipes.storage.couchdb.impl.CoreConfigurationStorageImpl;
+import org.apache.streampipes.storage.couchdb.impl.DataLakeMeasureStorage;
 import org.apache.streampipes.storage.couchdb.impl.DataProcessorStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.DataSinkStorageImpl;
 import org.apache.streampipes.storage.couchdb.impl.DataStreamStorageImpl;
@@ -115,9 +117,9 @@ public enum CouchDbStorageManager implements INoSqlStorage {
   }
 
   @Override
-  public CRUDStorage<DataLakeMeasure> getDataLakeStorage() {
-    return new DefaultCrudStorage<>(
-        () -> Utils.getCouchDbGsonClient("data-lake"),
+  public IDataLakeMeasureStorage getDataLakeStorage() {
+    return new DataLakeMeasureStorage(
+        () -> Utils.getCouchDbGsonClient(Utils.DATA_LAKE_DB_NAME),
         DataLakeMeasure.class
     );
   }
diff --git 
a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DataLakeMeasureStorage.java
 
b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DataLakeMeasureStorage.java
new file mode 100644
index 0000000000..38dec9498b
--- /dev/null
+++ 
b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/DataLakeMeasureStorage.java
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ *
+ */
+
+package org.apache.streampipes.storage.couchdb.impl;
+
+import org.apache.streampipes.model.datalake.DataLakeMeasure;
+import org.apache.streampipes.storage.api.IDataLakeMeasureStorage;
+
+import org.lightcouch.CouchDbClient;
+
+import java.util.List;
+import java.util.function.Supplier;
+
+public class DataLakeMeasureStorage extends 
DefaultCrudStorage<DataLakeMeasure> implements IDataLakeMeasureStorage {
+
+  public static final String MEASUREMENT_BY_NAME_VIEW = 
"measurement/by-measure-name";
+
+  public DataLakeMeasureStorage(Supplier<CouchDbClient> couchDbClientSupplier, 
Class<DataLakeMeasure> clazz) {
+    super(couchDbClientSupplier, clazz);
+  }
+
+  @Override
+  public DataLakeMeasure getByMeasureName(String measureName) {
+    List<DataLakeMeasure> results = couchDbClientSupplier.get()
+        .view(MEASUREMENT_BY_NAME_VIEW)
+        .key(measureName)
+        .includeDocs(true)
+        .limit(1)
+        .query(DataLakeMeasure.class);
+
+    if (!results.isEmpty()) {
+      return results.get(0);
+    } else {
+      return null;
+    }
+  }
+
+  @Override
+  public List<DataLakeMeasure> findAll() {
+    return couchDbClientSupplier.get()
+        .view(MEASUREMENT_BY_NAME_VIEW)
+        .includeDocs(true)
+        .query(DataLakeMeasure.class);
+  }
+}
diff --git 
a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Utils.java
 
b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Utils.java
index b6f9bf20ba..b98d8bafef 100644
--- 
a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Utils.java
+++ 
b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Utils.java
@@ -33,6 +33,7 @@ import org.lightcouch.CouchDbProperties;
 public class Utils {
 
   public static final String USER_DB_NAME = "users";
+  public static final String DATA_LAKE_DB_NAME = "data-lake";
 
   public static CouchDbClient getCouchDbDataProcessorDescriptionClient() {
     return getCouchDbGsonClient("data-processor");

Reply via email to