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 f349baae6e..b93ac0fc73 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 afa409a74b..512e661d1c 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 implements WidgetsBundleDao { @Autowired @@ -64,24 +64,34 @@ public class JpaWidgetsBundleDao extends JpaAbstractDao 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 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 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 ac163df189..cc47762de9 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 ?3 ORDER BY ID LIMIT ?1") List 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 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 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 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 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 4fcf7cb924..eafcfd3820 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 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 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 widgetsBundles1 = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId1, textPageLink1); + assertEquals(30, widgetsBundles1.size()); + + TextPageLink textPageLink2 = new TextPageLink(40, "WB"); + List widgetsBundles2 = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId2, textPageLink2); + assertEquals(40, widgetsBundles2.size()); + + TextPageLink textPageLink3 = new TextPageLink(40, "WB", + widgetsBundles2.get(39).getId().getId(), null); + List 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 widgetsBundles1 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink1); + assertEquals(30, widgetsBundles1.size()); + + TextPageLink textPageLink2 = new TextPageLink(30, "WB", + widgetsBundles1.get(29).getId().getId(), null); + List widgetsBundles2 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink2); + + assertEquals(30, widgetsBundles2.size()); + + TextPageLink textPageLink3 = new TextPageLink(30, "WB", + widgetsBundles2.get(29).getId().getId(), null); + List widgetsBundles3 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink3); + assertEquals(10, widgetsBundles3.size()); + + TextPageLink textPageLink4 = new TextPageLink(30, "WB", + widgetsBundles3.get(9).getId().getId(), null); + List 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 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); + } } }