diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java index b090d7da84..25393fb971 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java @@ -22,15 +22,21 @@ import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.id.AdminSettingsId; import org.thingsboard.server.dao.model.BaseEntity; +import java.io.IOException; import java.util.UUID; import static org.thingsboard.server.dao.model.ModelConstants.*; -//@Entity +@Data +@Slf4j +@Entity @Table(name = ADMIN_SETTINGS_COLUMN_FAMILY_NAME) public final class AdminSettingsEntity implements BaseEntity { @@ -45,7 +51,7 @@ public final class AdminSettingsEntity implements BaseEntity { private String key; @Column(name = ADMIN_SETTINGS_JSON_VALUE_PROPERTY) - private JsonNode jsonValue; + private String jsonValue; public AdminSettingsEntity() { super(); @@ -56,33 +62,21 @@ public final class AdminSettingsEntity implements BaseEntity { this.id = adminSettings.getId().getId(); } this.key = adminSettings.getKey(); - this.jsonValue = adminSettings.getJsonValue(); + if (jsonValue != null) { + this.jsonValue = adminSettings.getJsonValue().toString(); + } } - + + @Override public UUID getId() { return id; } + @Override public void setId(UUID id) { this.id = id; } - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public JsonNode getJsonValue() { - return jsonValue; - } - - public void setJsonValue(JsonNode jsonValue) { - this.jsonValue = jsonValue; - } - @Override public int hashCode() { final int prime = 31; @@ -138,7 +132,16 @@ public final class AdminSettingsEntity implements BaseEntity { AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(id)); adminSettings.setCreatedTime(UUIDs.unixTimestamp(id)); adminSettings.setKey(key); - adminSettings.setJsonValue(jsonValue); + if (jsonValue != null) { + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonNode = null; + try { + jsonNode = mapper.readTree(jsonValue); + adminSettings.setJsonValue(jsonNode); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } return adminSettings; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java index f32a89ec23..37fab4f487 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java @@ -21,6 +21,9 @@ import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.thingsboard.server.common.data.id.ComponentDescriptorId; import org.thingsboard.server.common.data.plugin.ComponentDescriptor; import org.thingsboard.server.common.data.plugin.ComponentScope; @@ -28,12 +31,12 @@ import org.thingsboard.server.common.data.plugin.ComponentType; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.SearchTextEntity; +import java.io.IOException; import java.util.UUID; -/** - * @author Andrew Shvayka - */ -//@Entity +@Data +@Slf4j +@Entity @Table(name = ModelConstants.COMPONENT_DESCRIPTOR_COLUMN_FAMILY_NAME) public class ComponentDescriptorEntity implements SearchTextEntity { @@ -57,7 +60,7 @@ public class ComponentDescriptorEntity implements SearchTextEntity { @@ -75,7 +81,7 @@ public final class CustomerEntity implements SearchTextEntity { private String email; @Column(name = ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY) - private JsonNode additionalInfo; + private String additionalInfo; public CustomerEntity() { super(); @@ -95,105 +101,21 @@ public final class CustomerEntity implements SearchTextEntity { this.zip = customer.getZip(); this.phone = customer.getPhone(); this.email = customer.getEmail(); - this.additionalInfo = customer.getAdditionalInfo(); + if (additionalInfo != null) { + this.additionalInfo = customer.getAdditionalInfo().toString(); + } } - + + @Override public UUID getId() { return id; } + @Override public void setId(UUID id) { this.id = id; } - public UUID getTenantId() { - return tenantId; - } - - public void setTenantId(UUID tenantId) { - this.tenantId = tenantId; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getCountry() { - return country; - } - - public void setCountry(String country) { - this.country = country; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getAddress2() { - return address2; - } - - public void setAddress2(String address2) { - this.address2 = address2; - } - - public String getZip() { - return zip; - } - - public void setZip(String zip) { - this.zip = zip; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public JsonNode getAdditionalInfo() { - return additionalInfo; - } - - public void setAdditionalInfo(JsonNode additionalInfo) { - this.additionalInfo = additionalInfo; - } - @Override public String getSearchTextSource() { return title; @@ -204,10 +126,6 @@ public final class CustomerEntity implements SearchTextEntity { this.searchText = searchText; } - public String getSearchText() { - return searchText; - } - @Override public int hashCode() { final int prime = 31; @@ -344,8 +262,15 @@ public final class CustomerEntity implements SearchTextEntity { customer.setZip(zip); customer.setPhone(phone); customer.setEmail(email); - customer.setAdditionalInfo(additionalInfo); + if (additionalInfo != null) { + ObjectMapper mapper = new ObjectMapper(); + try { + JsonNode jsonNode = mapper.readTree(additionalInfo); + customer.setAdditionalInfo(jsonNode); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } return customer; } - } \ No newline at end of file diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java index 77e12e2381..1ad0f84633 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java @@ -22,6 +22,9 @@ import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DashboardId; @@ -29,9 +32,12 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.SearchTextEntity; +import java.io.IOException; import java.util.UUID; -//@Entity +@Data +@Slf4j +@Entity @Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME) public final class DashboardEntity implements SearchTextEntity { @@ -55,7 +61,7 @@ public final class DashboardEntity implements SearchTextEntity { private String searchText; @Column(name = ModelConstants.DASHBOARD_CONFIGURATION_PROPERTY) - private JsonNode configuration; + private String configuration; public DashboardEntity() { super(); @@ -72,47 +78,18 @@ public final class DashboardEntity implements SearchTextEntity { this.customerId = dashboard.getCustomerId().getId(); } this.title = dashboard.getTitle(); - this.configuration = dashboard.getConfiguration(); + if (configuration != null) { + this.configuration = dashboard.getConfiguration().toString(); + } } - + + @Override public UUID getId() { return id; } + @Override public void setId(UUID id) { - this.id = id; - } - - public UUID getTenantId() { - return tenantId; - } - - public void setTenantId(UUID tenantId) { - this.tenantId = tenantId; - } - - public UUID getCustomerId() { - return customerId; - } - - public void setCustomerId(UUID customerId) { - this.customerId = customerId; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public JsonNode getConfiguration() { - return configuration; - } - - public void setConfiguration(JsonNode configuration) { - this.configuration = configuration; } @Override @@ -214,8 +191,16 @@ public final class DashboardEntity implements SearchTextEntity { dashboard.setCustomerId(new CustomerId(customerId)); } dashboard.setTitle(title); - dashboard.setConfiguration(configuration); + if (configuration != null) { + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonNode = null; + try { + jsonNode = mapper.readTree(configuration); + dashboard.setConfiguration(jsonNode); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } return dashboard; } - } \ No newline at end of file diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java index f0a50f1ffb..e5f1400d08 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java @@ -21,6 +21,8 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; + +import lombok.Data; import org.thingsboard.server.common.data.DashboardInfo; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DashboardId; @@ -30,7 +32,8 @@ import org.thingsboard.server.dao.model.SearchTextEntity; import java.util.UUID; -//@Entity +@Data +@Entity @Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME) public class DashboardInfoEntity implements SearchTextEntity { @@ -70,38 +73,6 @@ public class DashboardInfoEntity implements SearchTextEntity { this.title = dashboardInfo.getTitle(); } - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public UUID getTenantId() { - return tenantId; - } - - public void setTenantId(UUID tenantId) { - this.tenantId = tenantId; - } - - public UUID getCustomerId() { - return customerId; - } - - public void setCustomerId(UUID customerId) { - this.customerId = customerId; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - @Override public String getSearchTextSource() { return title; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java new file mode 100644 index 0000000000..a8443703ce --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java @@ -0,0 +1,45 @@ +package org.thingsboard.server.dao.sql.component; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.plugin.ComponentScope; +import org.thingsboard.server.common.data.plugin.ComponentType; +import org.thingsboard.server.dao.model.ToData; +import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) +public interface ComponentDescriptorRepository extends CrudRepository { + + ComponentDescriptorEntity findByClazz(String clazz); + + @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + + "ORDER BY ID LIMIT ?1") + List findByTypeFirstPage(int limit, int type, String textSearch); + + @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + + "AND ID > ?4 ORDER BY ID LIMIT ?1") + List findByTypeNextPage(int limit, int type, String textSearch, UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + + "AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + + "ORDER BY ID LIMIT ?1") + List findByScopeAndTypeFirstPage(int limit, int type, int scope, String textSearch); + + @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + + "AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + + "AND ID > ?5 ORDER BY ID LIMIT ?1") + List findByScopeAndTypeNextPage(int limit, int type, int scope, String textSearch, UUID idOffset); + + void deleteByClazz(String clazz); +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java new file mode 100644 index 0000000000..e6ab86a9d1 --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java @@ -0,0 +1,98 @@ +package org.thingsboard.server.dao.sql.component; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.id.ComponentDescriptorId; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.common.data.plugin.ComponentDescriptor; +import org.thingsboard.server.common.data.plugin.ComponentScope; +import org.thingsboard.server.common.data.plugin.ComponentType; +import org.thingsboard.server.dao.DaoUtil; +import org.thingsboard.server.dao.component.ComponentDescriptorDao; +import org.thingsboard.server.dao.model.ModelConstants; +import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity; +import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +@Component +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) +public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao + implements ComponentDescriptorDao { + + @Autowired + private ComponentDescriptorRepository componentDescriptorRepository; + + @Override + protected Class getEntityClass() { + return ComponentDescriptorEntity.class; + } + + @Override + protected String getColumnFamilyName() { + return ModelConstants.COMPONENT_DESCRIPTOR_COLUMN_FAMILY_NAME; + } + + @Override + protected CrudRepository getCrudRepository() { + return componentDescriptorRepository; + } + + @Override + public Optional saveIfNotExist(ComponentDescriptor component) { + boolean exists = componentDescriptorRepository.findOne(component.getId().getId()) != null; + if (exists) { + return Optional.empty(); + } + return Optional.of(save(component)); + } + + @Override + public ComponentDescriptor findById(ComponentDescriptorId componentId) { + return findById(componentId.getId()); + } + + @Override + public ComponentDescriptor findByClazz(String clazz) { + return DaoUtil.getData(componentDescriptorRepository.findByClazz(clazz)); + } + + @Override + public List findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) { + if (pageLink.getIdOffset() == null) { + return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeFirstPage(pageLink.getLimit(), + type.ordinal(), pageLink.getTextSearch())); + } else { + return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeNextPage(pageLink.getLimit(), + type.ordinal(), pageLink.getTextSearch(), pageLink.getIdOffset())); + } + } + + @Override + public List findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) { + if (pageLink.getIdOffset() == null) { + return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeFirstPage(pageLink.getLimit(), + type.ordinal(), scope.ordinal(), pageLink.getTextSearch())); + } else { + return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeNextPage(pageLink.getLimit(), + type.ordinal(), scope.ordinal(), pageLink.getTextSearch(), pageLink.getIdOffset())); + } + } + + @Override + public void deleteById(ComponentDescriptorId componentId) { + removeById(componentId.getId()); + } + + @Override + public void deleteByClazz(String clazz) { + componentDescriptorRepository.deleteByClazz(clazz); + } +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java new file mode 100644 index 0000000000..9616aa1b83 --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java @@ -0,0 +1,30 @@ +package org.thingsboard.server.dao.sql.customer; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.thingsboard.server.common.data.Customer; +import org.thingsboard.server.dao.model.sql.CustomerEntity; + +import java.util.List; +import java.util.UUID; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) +public interface CustomerRepository extends CrudRepository { + + @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?2 " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + + "ORDER BY ID LIMIT ?1") + List findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); + + @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?2 " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + + "AND ID > ?4 ORDER BY ID LIMIT ?1") + List findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?1") + List findByTenantId(UUID tenantId); +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java new file mode 100644 index 0000000000..3d60adecac --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java @@ -0,0 +1,52 @@ +package org.thingsboard.server.dao.sql.customer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.Customer; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.dao.DaoUtil; +import org.thingsboard.server.dao.customer.CustomerDao; +import org.thingsboard.server.dao.model.ModelConstants; +import org.thingsboard.server.dao.model.sql.CustomerEntity; +import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; + +import java.util.List; +import java.util.UUID; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +@Component +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) +public class JpaCustomerDao extends JpaAbstractSearchTextDao implements CustomerDao{ + + @Autowired + private CustomerRepository customerRepository; + + @Override + protected Class getEntityClass() { + return CustomerEntity.class; + } + + @Override + protected String getColumnFamilyName() { + return ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME; + } + + @Override + protected CrudRepository getCrudRepository() { + return customerRepository; + } + + @Override + public List findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) { + if (pageLink.getIdOffset() == null) { + return DaoUtil.convertDataList(customerRepository.findByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch())); + } else { + return DaoUtil.convertDataList(customerRepository.findByTenantIdNextPage(pageLink.getLimit(), tenantId, + pageLink.getTextSearch(), pageLink.getIdOffset())); + } + } +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java new file mode 100644 index 0000000000..de9a491b14 --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java @@ -0,0 +1,36 @@ +package org.thingsboard.server.dao.sql.dashboard; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.thingsboard.server.dao.model.sql.DashboardInfoEntity; + +import java.util.List; +import java.util.UUID; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) +public interface DashboardInfoRepository extends CrudRepository { + + @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + + "ORDER BY ID LIMIT ?1") + List findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); + + @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + + "AND ID > ?4 ORDER BY ID LIMIT ?1") + List findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " + + "AND CUSTOMER_ID = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + + "ORDER BY ID LIMIT ?1") + List findByTenantIdAndCustomerIdFirstPage(int limit, UUID tenantId, UUID customerId, String textSearch); + + @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " + + "AND CUSTOMER_ID = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + + "AND ID > ?5 ORDER BY ID LIMIT ?1") + List findByTenantIdAndCustomerIdNextPage(int limit, UUID tenantId, UUID customerId, String textSearch, UUID idOffset); +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java new file mode 100644 index 0000000000..40b164022e --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java @@ -0,0 +1,14 @@ +package org.thingsboard.server.dao.sql.dashboard; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.repository.CrudRepository; +import org.thingsboard.server.dao.model.sql.DashboardEntity; + +import java.util.UUID; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) +public interface DashboardRepository extends CrudRepository { +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java new file mode 100644 index 0000000000..6bc51bbb03 --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java @@ -0,0 +1,40 @@ +package org.thingsboard.server.dao.sql.dashboard; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.Dashboard; +import org.thingsboard.server.dao.dashboard.DashboardDao; +import org.thingsboard.server.dao.model.sql.DashboardEntity; +import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; + +import java.util.UUID; + +import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +@Component +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) +public class JpaDashboardDao extends JpaAbstractSearchTextDao implements DashboardDao { + + @Autowired + DashboardRepository dashboardRepository; + + @Override + protected Class getEntityClass() { + return DashboardEntity.class; + } + + @Override + protected String getColumnFamilyName() { + return DASHBOARD_COLUMN_FAMILY_NAME; + } + + @Override + protected CrudRepository getCrudRepository() { + return dashboardRepository; + } +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java new file mode 100644 index 0000000000..bfeaec04a2 --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java @@ -0,0 +1,65 @@ +package org.thingsboard.server.dao.sql.dashboard; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.DashboardInfo; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.dao.DaoUtil; +import org.thingsboard.server.dao.dashboard.DashboardInfoDao; +import org.thingsboard.server.dao.model.sql.DashboardInfoEntity; +import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; + +import java.util.List; +import java.util.UUID; + +import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +@Component +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) +public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao implements DashboardInfoDao { + + @Autowired + private DashboardInfoRepository dashboardInfoRepository; + + @Override + protected Class getEntityClass() { + return DashboardInfoEntity.class; + } + + @Override + protected String getColumnFamilyName() { + return DASHBOARD_COLUMN_FAMILY_NAME; + } + + @Override + protected CrudRepository getCrudRepository() { + return dashboardInfoRepository; + } + + @Override + public List findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) { + if (pageLink.getIdOffset() == null) { + return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdFirstPage( + pageLink.getLimit(), tenantId, pageLink.getTextSearch())); + } else { + return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdNextPage( + pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset())); + } + } + + @Override + public List findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) { + if (pageLink.getIdOffset() == null) { + return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdFirstPage( + pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch())); + } else { + return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdNextPage( + pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch(), pageLink.getIdOffset())); + } + } +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java new file mode 100644 index 0000000000..ce54d003df --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java @@ -0,0 +1,15 @@ +package org.thingsboard.server.dao.sql.settings; + +import org.springframework.data.repository.CrudRepository; +import org.thingsboard.server.dao.model.ToData; +import org.thingsboard.server.dao.model.sql.AdminSettingsEntity; + +import java.util.UUID; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +public interface AdminSettingsRepository extends CrudRepository { + + AdminSettingsEntity findByKey(String key); +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java new file mode 100644 index 0000000000..98f4467ceb --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java @@ -0,0 +1,42 @@ +package org.thingsboard.server.dao.sql.settings; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.repository.CrudRepository; +import org.thingsboard.server.common.data.AdminSettings; +import org.thingsboard.server.dao.DaoUtil; +import org.thingsboard.server.dao.model.sql.AdminSettingsEntity; +import org.thingsboard.server.dao.settings.AdminSettingsDao; +import org.thingsboard.server.dao.sql.JpaAbstractDao; + +import java.util.UUID; + +import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_COLUMN_FAMILY_NAME; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +public class JpaAdminSettingsDao extends JpaAbstractDao implements AdminSettingsDao{ + + @Autowired + private AdminSettingsRepository adminSettingsRepository; + + @Override + protected Class getEntityClass() { + return AdminSettingsEntity.class; + } + + @Override + protected String getColumnFamilyName() { + return ADMIN_SETTINGS_COLUMN_FAMILY_NAME; + } + + @Override + protected CrudRepository getCrudRepository() { + return adminSettingsRepository; + } + + @Override + public AdminSettings findByKey(String key) { + return DaoUtil.getData(adminSettingsRepository.findByKey(key)); + } +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java new file mode 100644 index 0000000000..08a90c261f --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java @@ -0,0 +1,71 @@ +package org.thingsboard.server.dao.sql.component; + +import com.datastax.driver.core.utils.UUIDs; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.thingsboard.server.common.data.Customer; +import org.thingsboard.server.common.data.id.ComponentDescriptorId; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.common.data.plugin.ComponentDescriptor; +import org.thingsboard.server.common.data.plugin.ComponentScope; +import org.thingsboard.server.common.data.plugin.ComponentType; +import org.thingsboard.server.dao.AbstractJpaDaoTest; +import org.thingsboard.server.dao.component.ComponentDescriptorDao; + +import java.util.List; + +import static org.junit.Assert.assertEquals; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +public class JpaBaseComponentDescriptorDaoTest extends AbstractJpaDaoTest { + + @Autowired + private ComponentDescriptorDao componentDescriptorDao; + + @Test + public void findByType() { + for (int i = 0; i < 20; i++) { + createComponentDescriptor(ComponentType.PLUGIN, ComponentScope.SYSTEM, i); + createComponentDescriptor(ComponentType.ACTION, ComponentScope.TENANT, i + 20); + } + + TextPageLink pageLink1 = new TextPageLink(15, "COMPONENT_"); + List components1 = componentDescriptorDao.findByTypeAndPageLink(ComponentType.PLUGIN, pageLink1); + assertEquals(15, components1.size()); + + TextPageLink pageLink2 = new TextPageLink(15, "COMPONENT_", components1.get(14).getId().getId(), null); + List components2 = componentDescriptorDao.findByTypeAndPageLink(ComponentType.PLUGIN, pageLink2); + assertEquals(5, components2.size()); + } + + @Test + public void findByTypeAndSocpe() { + for (int i = 0; i < 20; i++) { + createComponentDescriptor(ComponentType.PLUGIN, ComponentScope.SYSTEM, i); + createComponentDescriptor(ComponentType.ACTION, ComponentScope.TENANT, i + 20); + createComponentDescriptor(ComponentType.FILTER, ComponentScope.SYSTEM, i + 40); + } + + TextPageLink pageLink1 = new TextPageLink(15, "COMPONENT_"); + List components1 = componentDescriptorDao.findByScopeAndTypeAndPageLink( + ComponentScope.SYSTEM, ComponentType.FILTER, pageLink1); + assertEquals(15, components1.size()); + + TextPageLink pageLink2 = new TextPageLink(15, "COMPONENT_", components1.get(14).getId().getId(), null); + List components2 = componentDescriptorDao.findByScopeAndTypeAndPageLink( + ComponentScope.SYSTEM, ComponentType.FILTER, pageLink2); + assertEquals(5, components2.size()); + } + + private void createComponentDescriptor(ComponentType type, ComponentScope scope, int index) { + ComponentDescriptor component = new ComponentDescriptor(); + component.setId(new ComponentDescriptorId(UUIDs.timeBased())); + component.setType(type); + component.setScope(scope); + component.setName("COMPONENT_" + index); + componentDescriptorDao.save(component); + } + +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java new file mode 100644 index 0000000000..f300611efa --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java @@ -0,0 +1,52 @@ +package org.thingsboard.server.dao.sql.customer; + +import com.datastax.driver.core.utils.UUIDs; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.thingsboard.server.common.data.Customer; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.dao.AbstractJpaDaoTest; +import org.thingsboard.server.dao.customer.CustomerDao; + +import java.util.List; +import java.util.UUID; + +import static org.junit.Assert.assertEquals; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +public class JpaCustomerDaoTest extends AbstractJpaDaoTest { + + @Autowired + private CustomerDao customerDao; + + @Test + public void testFindByTenantId() { + UUID tenantId1 = UUIDs.timeBased(); + UUID tenantId2 = UUIDs.timeBased(); + + for (int i = 0; i < 20; i++) { + createCustomer(tenantId1, i); + createCustomer(tenantId2, i * 2); + } + + TextPageLink pageLink1 = new TextPageLink(15, "CUSTOMER"); + List customers1 = customerDao.findCustomersByTenantId(tenantId1, pageLink1); + assertEquals(15, customers1.size()); + + TextPageLink pageLink2 = new TextPageLink(15, "CUSTOMER", customers1.get(14).getId().getId(), null); + List customers2 = customerDao.findCustomersByTenantId(tenantId1, pageLink2); + assertEquals(5, customers2.size()); + } + + private void createCustomer(UUID tenantId, int index) { + Customer customer = new Customer(); + customer.setId(new CustomerId(UUIDs.timeBased())); + customer.setTenantId(new TenantId(tenantId)); + customer.setTitle("CUSTOMER_" + index); + customerDao.save(customer); + } +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java new file mode 100644 index 0000000000..1360ea4bce --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java @@ -0,0 +1,78 @@ +package org.thingsboard.server.dao.sql.dashboard; + +import com.datastax.driver.core.utils.UUIDs; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.thingsboard.server.common.data.DashboardInfo; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.DashboardId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.dao.AbstractJpaDaoTest; +import org.thingsboard.server.dao.dashboard.DashboardInfoDao; + +import java.util.List; +import java.util.UUID; + +/** + * Created by Valerii Sosliuk on 5/6/2017. + */ +public class JpaDashboardInfoDaoTest extends AbstractJpaDaoTest { + + @Autowired + private DashboardInfoDao dashboardInfoDao; + + @Test + public void testFindDashboardsByTenantId() { + UUID tenantId1 = UUIDs.timeBased(); + UUID customerId1 = UUIDs.timeBased(); + UUID tenantId2 = UUIDs.timeBased(); + UUID customerId2 = UUIDs.timeBased(); + + for (int i = 0; i < 20; i++) { + createDashboard(tenantId1, customerId1, i); + createDashboard(tenantId2, customerId2, i * 2); + } + + TextPageLink pageLink1 = new TextPageLink(15, "DASHBOARD"); + List dashboardInfos1 = dashboardInfoDao.findDashboardsByTenantId(tenantId1, pageLink1); + assertEquals(15, dashboardInfos1.size()); + + TextPageLink pageLink2 = new TextPageLink(15, "DASHBOARD", dashboardInfos1.get(14).getId().getId(), null); + List dashboardInfos2 = dashboardInfoDao.findDashboardsByTenantId(tenantId1, pageLink2); + assertEquals(5, dashboardInfos2.size()); + } + + @Test + public void testFindDashboardsByTenantAndCustomerId() { + UUID tenantId1 = UUIDs.timeBased(); + UUID customerId1 = UUIDs.timeBased(); + UUID tenantId2 = UUIDs.timeBased(); + UUID customerId2 = UUIDs.timeBased(); + + for (int i = 0; i < 20; i++) { + createDashboard(tenantId1, customerId1, i); + createDashboard(tenantId2, customerId2, i * 2); + } + + TextPageLink pageLink1 = new TextPageLink(15, "DASHBOARD"); + List dashboardInfos1 = dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId1, customerId1, pageLink1); + assertEquals(15, dashboardInfos1.size()); + + TextPageLink pageLink2 = new TextPageLink(15, "DASHBOARD", dashboardInfos1.get(14).getId().getId(), null); + List dashboardInfos2 = dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId1, customerId1, pageLink2); + assertEquals(5, dashboardInfos2.size()); + } + + private void assertEquals(int i, int size) { + } + + private void createDashboard(UUID tenantId, UUID customerId, int index) { + DashboardInfo dashboardInfo = new DashboardInfo(); + dashboardInfo.setId(new DashboardId(UUIDs.timeBased())); + dashboardInfo.setTenantId(new TenantId(tenantId)); + dashboardInfo.setCustomerId(new CustomerId(customerId)); + dashboardInfo.setTitle("DASHBOARD_" + index); + dashboardInfoDao.save(dashboardInfo); + } +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java index 4f1b31598a..58507af7c4 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java @@ -1,13 +1,11 @@ package org.thingsboard.server.dao.sql.device; import com.datastax.driver.core.utils.UUIDs; -import com.github.springtestdbunit.annotation.DatabaseOperation; -import com.github.springtestdbunit.annotation.DatabaseSetup; -import com.github.springtestdbunit.annotation.DatabaseTearDown; -import com.google.common.util.concurrent.*; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DeviceId; @@ -17,7 +15,6 @@ import org.thingsboard.server.dao.AbstractJpaDaoTest; import org.thingsboard.server.dao.device.DeviceDao; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.concurrent.ExecutionException; @@ -29,15 +26,12 @@ import static org.junit.Assert.assertNotNull; /** * Created by Valerii Sosliuk on 5/6/2017. */ -@Transactional public class JpaDeviceDaoTest extends AbstractJpaDaoTest { @Autowired private DeviceDao deviceDao; @Test - @DatabaseSetup(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL) - @DatabaseTearDown(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL) public void testFindDevicesByTenantId() { UUID tenantId1 = UUIDs.timeBased(); UUID tenantId2 = UUIDs.timeBased(); @@ -55,8 +49,6 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { } @Test - @DatabaseSetup(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL) - @DatabaseTearDown(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL) public void testFindAsync() throws ExecutionException, InterruptedException { UUID tenantId = UUIDs.timeBased(); UUID customerId = UUIDs.timeBased(); @@ -75,8 +67,6 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { } @Test - @DatabaseSetup(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL) - @DatabaseTearDown(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL) public void testFindDevicesByTenantIdAndIdsAsync() throws ExecutionException, InterruptedException { UUID tenantId1 = UUIDs.timeBased(); UUID customerId1 = UUIDs.timeBased(); @@ -100,8 +90,6 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest { } @Test - @DatabaseSetup(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL) - @DatabaseTearDown(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL) public void testFindDevicesByTenantIdAndCustomerIdAndIdsAsync() throws ExecutionException, InterruptedException { UUID tenantId1 = UUIDs.timeBased(); UUID customerId1 = UUIDs.timeBased(); diff --git a/dao/src/test/resources/jpa-test.properties b/dao/src/test/resources/jpa-test.properties index f887e08db0..54025ab561 100644 --- a/dao/src/test/resources/jpa-test.properties +++ b/dao/src/test/resources/jpa-test.properties @@ -1,10 +1,6 @@ cassandra.enabled=false sql.enabled=true -#sql.datasource.url=jdbc:h2:mem:thingsboard -#sql.datasource.username=sa -#sql.datasource.password= -#spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=false spring.jpa.hibernate.ddl-auto=create-drop