thingsboard-memoizeit

Details

diff --git a/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java b/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java
index f349baa..b93ac0f 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java
@@ -15,24 +15,14 @@
  */
 package org.thingsboard.server.dao;
 
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
-import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
-import org.springframework.test.context.TestPropertySource;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.sql.DataSource;
-
 /**
  * @author Valerii Sosliuk
  */
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java
index afa409a..512e661 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java
@@ -16,8 +16,7 @@
 package org.thingsboard.server.dao.sql.widget;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.page.TextPageLink;
@@ -36,6 +35,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.WIDGETS_BUNDLE_COL
  * Created by Valerii Sosliuk on 4/23/2017.
  */
 @Component
+@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
 public class JpaWidgetsBundleDao extends JpaAbstractDao<WidgetsBundleEntity, WidgetsBundle> implements WidgetsBundleDao {
 
     @Autowired
@@ -64,24 +64,34 @@ public class JpaWidgetsBundleDao extends JpaAbstractDao<WidgetsBundleEntity, Wid
     @Override
     public List<WidgetsBundle> findSystemWidgetsBundles(TextPageLink pageLink) {
         if (pageLink.getIdOffset() == null) {
-            return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesFirstPage(pageLink.getLimit()
-                    , pageLink.getTextSearch()));
+            return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesFirstPage(pageLink.getLimit(),
+                    pageLink.getTextSearch()));
         } else {
-            return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesNextPage(pageLink.getLimit()
-                    , pageLink.getTextSearch(), pageLink.getIdOffset()));
+            return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesNextPage(pageLink.getLimit(),
+                    pageLink.getTextSearch(), pageLink.getIdOffset()));
         }
-        //return DaoUtil.convertDataList(widgetsBundleRepository.findBySearchTextStartsWithIgnoreCase(pageLink.getTextSearch().toLowerCase()));
-        //return DaoUtil.convertDataList(widgetsBundleRepository.findBySearchTextStartsWithIgnoreCase(pageLink.getTextSearch().toLowerCase() ,pageable));
     }
 
     @Override
     public List<WidgetsBundle> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
-        throw new RuntimeException("Not implemented");
+        if (pageLink.getIdOffset() == null) {
+            return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(),
+                    tenantId, pageLink.getTextSearch()));
+        } else {
+            return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(),
+                    tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()));
+        }
     }
 
     @Override
     public List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
-        throw new RuntimeException("Not implemented");
+        if (pageLink.getIdOffset() == null) {
+            return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(),
+                    tenantId, pageLink.getTextSearch()));
+        } else {
+            return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(),
+                    tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()));
+        }
     }
 
     @Override
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java
index ac163df..cc47762 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java
@@ -47,4 +47,23 @@ public interface WidgetsBundleRepository extends JpaRepository<WidgetsBundleEnti
             "AND ID > ?3 ORDER BY ID LIMIT ?1")
     List<WidgetsBundleEntity> findSystemWidgetsBundlesNextPage(Integer limit, String searchText, UUID idOffset);
 
+    @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "ORDER BY ID LIMIT ?1")
+    List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "AND ID > ?4 ORDER BY ID LIMIT ?1")
+    List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE (TENANT_ID IS NULL OR TENANT_ID = ?2) " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "ORDER BY ID LIMIT ?1")
+    List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE (TENANT_ID IS NULL OR TENANT_ID = ?2) " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "AND ID > ?4 ORDER BY ID LIMIT ?1")
+    List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
 }
diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java
index 4fcf7cb..eafcfd3 100644
--- a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java
+++ b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java
@@ -20,6 +20,7 @@ import com.github.springtestdbunit.annotation.DatabaseSetup;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.thingsboard.server.common.data.id.TenantId;
 import org.thingsboard.server.common.data.id.WidgetsBundleId;
 import org.thingsboard.server.common.data.page.TextPageLink;
 import org.thingsboard.server.common.data.widget.WidgetsBundle;
@@ -56,27 +57,108 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest {
     @Test
     @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
     public void testFindSystemWidgetsBundles() {
-        for (int i = 0; i < 30; i++) {
-            WidgetsBundle widgetsBundle = new WidgetsBundle();
-            widgetsBundle.setAlias("WB" + i);
-            widgetsBundle.setTitle("WB" + i);
-            widgetsBundle.setId(new WidgetsBundleId(UUIDs.timeBased()));
-            widgetsBundleDao.save(widgetsBundle);
-        }
+        createSystemWidgetBundles(30, "WB_");
         assertEquals(30, widgetsBundleDao.find().size());
         // Get first page
         TextPageLink textPageLink1 = new TextPageLink(10, "WB");
         List<WidgetsBundle> widgetsBundles1 = widgetsBundleDao.findSystemWidgetsBundles(textPageLink1);
         assertEquals(10, widgetsBundles1.size());
-        for (WidgetsBundle widgetsBundle : widgetsBundles1) {
-            System.out.println(widgetsBundle.getSearchText());
-        }
+        // Get next page
         TextPageLink textPageLink2 = new TextPageLink(10, "WB", widgetsBundles1.get(9).getId().getId(), null);
         List<WidgetsBundle> widgetsBundles2 = widgetsBundleDao.findSystemWidgetsBundles(textPageLink2);
-        assertEquals(10, widgetsBundles1.size());
-        for (WidgetsBundle widgetsBundle : widgetsBundles2) {
-            System.out.println(widgetsBundle.getSearchText());
+        assertEquals(10, widgetsBundles2.size());
+    }
+
+    @Test
+    @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
+    public void testFindWidgetsBundlesByTenantId() {
+        UUID tenantId1 = UUIDs.timeBased();
+        UUID tenantId2 = UUIDs.timeBased();
+        // Create a bunch of widgetBundles
+        for (int i= 0; i < 10; i++) {
+            createWidgetBundles(3, tenantId1, "WB1_");
+            createWidgetBundles(5, tenantId2, "WB2_");
+            createSystemWidgetBundles(10, "WB_SYS_");
         }
+        assertEquals(180, widgetsBundleDao.find().size());
+
+        TextPageLink textPageLink1 = new TextPageLink(40, "WB");
+        List<WidgetsBundle> widgetsBundles1 = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId1, textPageLink1);
+        assertEquals(30, widgetsBundles1.size());
+
+        TextPageLink textPageLink2 = new TextPageLink(40, "WB");
+        List<WidgetsBundle> widgetsBundles2 = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId2, textPageLink2);
+        assertEquals(40, widgetsBundles2.size());
+
+        TextPageLink textPageLink3 = new TextPageLink(40, "WB",
+                widgetsBundles2.get(39).getId().getId(), null);
+        List<WidgetsBundle> widgetsBundles3 = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId2, textPageLink3);
+        assertEquals(10, widgetsBundles3.size());
+    }
+
+    @Test
+    @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
+    public void testFindAllWidgetsBundlesByTenantId() {
+        UUID tenantId1 = UUIDs.timeBased();
+        UUID tenantId2 = UUIDs.timeBased();
+        // Create a bunch of widgetBundles
+        for (int i= 0; i < 10; i++) {
+            createWidgetBundles( 5, tenantId1,"WB1_");
+            createWidgetBundles(3, tenantId2, "WB2_");
+            createSystemWidgetBundles(2, "WB_SYS_");
+        }
+
+        TextPageLink textPageLink1 = new TextPageLink(30, "WB");
+        List<WidgetsBundle> widgetsBundles1 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink1);
+        assertEquals(30, widgetsBundles1.size());
+
+        TextPageLink textPageLink2 = new TextPageLink(30, "WB",
+                widgetsBundles1.get(29).getId().getId(), null);
+        List<WidgetsBundle> widgetsBundles2 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink2);
 
+        assertEquals(30, widgetsBundles2.size());
+
+        TextPageLink textPageLink3 = new TextPageLink(30, "WB",
+                widgetsBundles2.get(29).getId().getId(), null);
+        List<WidgetsBundle> widgetsBundles3 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink3);
+        assertEquals(10, widgetsBundles3.size());
+
+        TextPageLink textPageLink4 = new TextPageLink(30, "WB",
+                widgetsBundles3.get(9).getId().getId(), null);
+        List<WidgetsBundle> widgetsBundles4 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink4);
+        assertEquals(0, widgetsBundles4.size());
+    }
+
+
+    @Test
+    @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
+    public void testNonSearchTextNotFound() {
+        UUID tenantId = UUIDs.timeBased();
+        createWidgetBundles(5, tenantId, "ABC_");
+        createSystemWidgetBundles(5, "SYS_");
+
+        TextPageLink textPageLink = new TextPageLink(30, "WB");
+        List<WidgetsBundle> widgetsBundles4 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId, textPageLink);
+        assertEquals(0, widgetsBundles4.size());
+    }
+
+    private void createWidgetBundles(int count, UUID tenantId, String prefix) {
+        for (int i = 0; i < count; i++) {
+            WidgetsBundle widgetsBundle = new WidgetsBundle();
+            widgetsBundle.setAlias(prefix + i);
+            widgetsBundle.setTitle(prefix + i);
+            widgetsBundle.setId(new WidgetsBundleId(UUIDs.timeBased()));
+            widgetsBundle.setTenantId(new TenantId(tenantId));
+            widgetsBundleDao.save(widgetsBundle);
+        }
+    }
+    private void createSystemWidgetBundles(int count, String prefix) {
+        for (int i = 0; i < count; i++) {
+            WidgetsBundle widgetsBundle = new WidgetsBundle();
+            widgetsBundle.setAlias(prefix + i);
+            widgetsBundle.setTitle(prefix + i);
+            widgetsBundle.setId(new WidgetsBundleId(UUIDs.timeBased()));
+            widgetsBundleDao.save(widgetsBundle);
+        }
     }
 }