Commit 66d0e0ccc3a105381df598befc9d492034f92e12

Authored by mp-loki
1 parent a6e9ca9e

JpaWidgetsBundleDao - added missing implementations and tests

@@ -15,24 +15,14 @@ @@ -15,24 +15,14 @@
15 */ 15 */
16 package org.thingsboard.server.dao; 16 package org.thingsboard.server.dao;
17 17
18 -import org.springframework.beans.factory.annotation.Value;  
19 import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 18 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
20 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
21 import org.springframework.boot.autoconfigure.domain.EntityScan; 20 import org.springframework.boot.autoconfigure.domain.EntityScan;
22 -import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;  
23 -import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;  
24 -import org.springframework.context.annotation.Bean;  
25 import org.springframework.context.annotation.ComponentScan; 21 import org.springframework.context.annotation.ComponentScan;
26 import org.springframework.context.annotation.Configuration; 22 import org.springframework.context.annotation.Configuration;
27 import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 23 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
28 -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;  
29 -import org.springframework.test.context.TestPropertySource;  
30 import org.springframework.transaction.annotation.EnableTransactionManagement; 24 import org.springframework.transaction.annotation.EnableTransactionManagement;
31 25
32 -import javax.persistence.EntityManager;  
33 -import javax.persistence.EntityManagerFactory;  
34 -import javax.sql.DataSource;  
35 -  
36 /** 26 /**
37 * @author Valerii Sosliuk 27 * @author Valerii Sosliuk
38 */ 28 */
@@ -16,8 +16,7 @@ @@ -16,8 +16,7 @@
16 package org.thingsboard.server.dao.sql.widget; 16 package org.thingsboard.server.dao.sql.widget;
17 17
18 import org.springframework.beans.factory.annotation.Autowired; 18 import org.springframework.beans.factory.annotation.Autowired;
19 -import org.springframework.data.domain.PageRequest;  
20 -import org.springframework.data.domain.Pageable; 19 +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
21 import org.springframework.data.repository.CrudRepository; 20 import org.springframework.data.repository.CrudRepository;
22 import org.springframework.stereotype.Component; 21 import org.springframework.stereotype.Component;
23 import org.thingsboard.server.common.data.page.TextPageLink; 22 import org.thingsboard.server.common.data.page.TextPageLink;
@@ -36,6 +35,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.WIDGETS_BUNDLE_COL @@ -36,6 +35,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.WIDGETS_BUNDLE_COL
36 * Created by Valerii Sosliuk on 4/23/2017. 35 * Created by Valerii Sosliuk on 4/23/2017.
37 */ 36 */
38 @Component 37 @Component
  38 +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
39 public class JpaWidgetsBundleDao extends JpaAbstractDao<WidgetsBundleEntity, WidgetsBundle> implements WidgetsBundleDao { 39 public class JpaWidgetsBundleDao extends JpaAbstractDao<WidgetsBundleEntity, WidgetsBundle> implements WidgetsBundleDao {
40 40
41 @Autowired 41 @Autowired
@@ -64,24 +64,34 @@ public class JpaWidgetsBundleDao extends JpaAbstractDao<WidgetsBundleEntity, Wid @@ -64,24 +64,34 @@ public class JpaWidgetsBundleDao extends JpaAbstractDao<WidgetsBundleEntity, Wid
64 @Override 64 @Override
65 public List<WidgetsBundle> findSystemWidgetsBundles(TextPageLink pageLink) { 65 public List<WidgetsBundle> findSystemWidgetsBundles(TextPageLink pageLink) {
66 if (pageLink.getIdOffset() == null) { 66 if (pageLink.getIdOffset() == null) {
67 - return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesFirstPage(pageLink.getLimit()  
68 - , pageLink.getTextSearch())); 67 + return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesFirstPage(pageLink.getLimit(),
  68 + pageLink.getTextSearch()));
69 } else { 69 } else {
70 - return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesNextPage(pageLink.getLimit()  
71 - , pageLink.getTextSearch(), pageLink.getIdOffset())); 70 + return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesNextPage(pageLink.getLimit(),
  71 + pageLink.getTextSearch(), pageLink.getIdOffset()));
72 } 72 }
73 - //return DaoUtil.convertDataList(widgetsBundleRepository.findBySearchTextStartsWithIgnoreCase(pageLink.getTextSearch().toLowerCase()));  
74 - //return DaoUtil.convertDataList(widgetsBundleRepository.findBySearchTextStartsWithIgnoreCase(pageLink.getTextSearch().toLowerCase() ,pageable));  
75 } 73 }
76 74
77 @Override 75 @Override
78 public List<WidgetsBundle> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { 76 public List<WidgetsBundle> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
79 - throw new RuntimeException("Not implemented"); 77 + if (pageLink.getIdOffset() == null) {
  78 + return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(),
  79 + tenantId, pageLink.getTextSearch()));
  80 + } else {
  81 + return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(),
  82 + tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()));
  83 + }
80 } 84 }
81 85
82 @Override 86 @Override
83 public List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { 87 public List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
84 - throw new RuntimeException("Not implemented"); 88 + if (pageLink.getIdOffset() == null) {
  89 + return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(),
  90 + tenantId, pageLink.getTextSearch()));
  91 + } else {
  92 + return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(),
  93 + tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()));
  94 + }
85 } 95 }
86 96
87 @Override 97 @Override
@@ -47,4 +47,23 @@ public interface WidgetsBundleRepository extends JpaRepository<WidgetsBundleEnti @@ -47,4 +47,23 @@ public interface WidgetsBundleRepository extends JpaRepository<WidgetsBundleEnti
47 "AND ID > ?3 ORDER BY ID LIMIT ?1") 47 "AND ID > ?3 ORDER BY ID LIMIT ?1")
48 List<WidgetsBundleEntity> findSystemWidgetsBundlesNextPage(Integer limit, String searchText, UUID idOffset); 48 List<WidgetsBundleEntity> findSystemWidgetsBundlesNextPage(Integer limit, String searchText, UUID idOffset);
49 49
  50 + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " +
  51 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  52 + "ORDER BY ID LIMIT ?1")
  53 + List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
  54 +
  55 + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " +
  56 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  57 + "AND ID > ?4 ORDER BY ID LIMIT ?1")
  58 + List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  59 +
  60 + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE (TENANT_ID IS NULL OR TENANT_ID = ?2) " +
  61 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  62 + "ORDER BY ID LIMIT ?1")
  63 + List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
  64 +
  65 + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE (TENANT_ID IS NULL OR TENANT_ID = ?2) " +
  66 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  67 + "AND ID > ?4 ORDER BY ID LIMIT ?1")
  68 + List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
50 } 69 }
@@ -20,6 +20,7 @@ import com.github.springtestdbunit.annotation.DatabaseSetup; @@ -20,6 +20,7 @@ import com.github.springtestdbunit.annotation.DatabaseSetup;
20 import org.junit.Ignore; 20 import org.junit.Ignore;
21 import org.junit.Test; 21 import org.junit.Test;
22 import org.springframework.beans.factory.annotation.Autowired; 22 import org.springframework.beans.factory.annotation.Autowired;
  23 +import org.thingsboard.server.common.data.id.TenantId;
23 import org.thingsboard.server.common.data.id.WidgetsBundleId; 24 import org.thingsboard.server.common.data.id.WidgetsBundleId;
24 import org.thingsboard.server.common.data.page.TextPageLink; 25 import org.thingsboard.server.common.data.page.TextPageLink;
25 import org.thingsboard.server.common.data.widget.WidgetsBundle; 26 import org.thingsboard.server.common.data.widget.WidgetsBundle;
@@ -56,27 +57,108 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { @@ -56,27 +57,108 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest {
56 @Test 57 @Test
57 @DatabaseSetup("classpath:dbunit/empty_dataset.xml") 58 @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
58 public void testFindSystemWidgetsBundles() { 59 public void testFindSystemWidgetsBundles() {
59 - for (int i = 0; i < 30; i++) {  
60 - WidgetsBundle widgetsBundle = new WidgetsBundle();  
61 - widgetsBundle.setAlias("WB" + i);  
62 - widgetsBundle.setTitle("WB" + i);  
63 - widgetsBundle.setId(new WidgetsBundleId(UUIDs.timeBased()));  
64 - widgetsBundleDao.save(widgetsBundle);  
65 - } 60 + createSystemWidgetBundles(30, "WB_");
66 assertEquals(30, widgetsBundleDao.find().size()); 61 assertEquals(30, widgetsBundleDao.find().size());
67 // Get first page 62 // Get first page
68 TextPageLink textPageLink1 = new TextPageLink(10, "WB"); 63 TextPageLink textPageLink1 = new TextPageLink(10, "WB");
69 List<WidgetsBundle> widgetsBundles1 = widgetsBundleDao.findSystemWidgetsBundles(textPageLink1); 64 List<WidgetsBundle> widgetsBundles1 = widgetsBundleDao.findSystemWidgetsBundles(textPageLink1);
70 assertEquals(10, widgetsBundles1.size()); 65 assertEquals(10, widgetsBundles1.size());
71 - for (WidgetsBundle widgetsBundle : widgetsBundles1) {  
72 - System.out.println(widgetsBundle.getSearchText());  
73 - } 66 + // Get next page
74 TextPageLink textPageLink2 = new TextPageLink(10, "WB", widgetsBundles1.get(9).getId().getId(), null); 67 TextPageLink textPageLink2 = new TextPageLink(10, "WB", widgetsBundles1.get(9).getId().getId(), null);
75 List<WidgetsBundle> widgetsBundles2 = widgetsBundleDao.findSystemWidgetsBundles(textPageLink2); 68 List<WidgetsBundle> widgetsBundles2 = widgetsBundleDao.findSystemWidgetsBundles(textPageLink2);
76 - assertEquals(10, widgetsBundles1.size());  
77 - for (WidgetsBundle widgetsBundle : widgetsBundles2) {  
78 - System.out.println(widgetsBundle.getSearchText()); 69 + assertEquals(10, widgetsBundles2.size());
  70 + }
  71 +
  72 + @Test
  73 + @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
  74 + public void testFindWidgetsBundlesByTenantId() {
  75 + UUID tenantId1 = UUIDs.timeBased();
  76 + UUID tenantId2 = UUIDs.timeBased();
  77 + // Create a bunch of widgetBundles
  78 + for (int i= 0; i < 10; i++) {
  79 + createWidgetBundles(3, tenantId1, "WB1_");
  80 + createWidgetBundles(5, tenantId2, "WB2_");
  81 + createSystemWidgetBundles(10, "WB_SYS_");
79 } 82 }
  83 + assertEquals(180, widgetsBundleDao.find().size());
  84 +
  85 + TextPageLink textPageLink1 = new TextPageLink(40, "WB");
  86 + List<WidgetsBundle> widgetsBundles1 = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId1, textPageLink1);
  87 + assertEquals(30, widgetsBundles1.size());
  88 +
  89 + TextPageLink textPageLink2 = new TextPageLink(40, "WB");
  90 + List<WidgetsBundle> widgetsBundles2 = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId2, textPageLink2);
  91 + assertEquals(40, widgetsBundles2.size());
  92 +
  93 + TextPageLink textPageLink3 = new TextPageLink(40, "WB",
  94 + widgetsBundles2.get(39).getId().getId(), null);
  95 + List<WidgetsBundle> widgetsBundles3 = widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId2, textPageLink3);
  96 + assertEquals(10, widgetsBundles3.size());
  97 + }
  98 +
  99 + @Test
  100 + @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
  101 + public void testFindAllWidgetsBundlesByTenantId() {
  102 + UUID tenantId1 = UUIDs.timeBased();
  103 + UUID tenantId2 = UUIDs.timeBased();
  104 + // Create a bunch of widgetBundles
  105 + for (int i= 0; i < 10; i++) {
  106 + createWidgetBundles( 5, tenantId1,"WB1_");
  107 + createWidgetBundles(3, tenantId2, "WB2_");
  108 + createSystemWidgetBundles(2, "WB_SYS_");
  109 + }
  110 +
  111 + TextPageLink textPageLink1 = new TextPageLink(30, "WB");
  112 + List<WidgetsBundle> widgetsBundles1 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink1);
  113 + assertEquals(30, widgetsBundles1.size());
  114 +
  115 + TextPageLink textPageLink2 = new TextPageLink(30, "WB",
  116 + widgetsBundles1.get(29).getId().getId(), null);
  117 + List<WidgetsBundle> widgetsBundles2 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink2);
80 118
  119 + assertEquals(30, widgetsBundles2.size());
  120 +
  121 + TextPageLink textPageLink3 = new TextPageLink(30, "WB",
  122 + widgetsBundles2.get(29).getId().getId(), null);
  123 + List<WidgetsBundle> widgetsBundles3 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink3);
  124 + assertEquals(10, widgetsBundles3.size());
  125 +
  126 + TextPageLink textPageLink4 = new TextPageLink(30, "WB",
  127 + widgetsBundles3.get(9).getId().getId(), null);
  128 + List<WidgetsBundle> widgetsBundles4 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, textPageLink4);
  129 + assertEquals(0, widgetsBundles4.size());
  130 + }
  131 +
  132 +
  133 + @Test
  134 + @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
  135 + public void testNonSearchTextNotFound() {
  136 + UUID tenantId = UUIDs.timeBased();
  137 + createWidgetBundles(5, tenantId, "ABC_");
  138 + createSystemWidgetBundles(5, "SYS_");
  139 +
  140 + TextPageLink textPageLink = new TextPageLink(30, "WB");
  141 + List<WidgetsBundle> widgetsBundles4 = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId, textPageLink);
  142 + assertEquals(0, widgetsBundles4.size());
  143 + }
  144 +
  145 + private void createWidgetBundles(int count, UUID tenantId, String prefix) {
  146 + for (int i = 0; i < count; i++) {
  147 + WidgetsBundle widgetsBundle = new WidgetsBundle();
  148 + widgetsBundle.setAlias(prefix + i);
  149 + widgetsBundle.setTitle(prefix + i);
  150 + widgetsBundle.setId(new WidgetsBundleId(UUIDs.timeBased()));
  151 + widgetsBundle.setTenantId(new TenantId(tenantId));
  152 + widgetsBundleDao.save(widgetsBundle);
  153 + }
  154 + }
  155 + private void createSystemWidgetBundles(int count, String prefix) {
  156 + for (int i = 0; i < count; i++) {
  157 + WidgetsBundle widgetsBundle = new WidgetsBundle();
  158 + widgetsBundle.setAlias(prefix + i);
  159 + widgetsBundle.setTitle(prefix + i);
  160 + widgetsBundle.setId(new WidgetsBundleId(UUIDs.timeBased()));
  161 + widgetsBundleDao.save(widgetsBundle);
  162 + }
81 } 163 }
82 } 164 }