diff --git a/application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java index 5d7f9ec7d6..1f80c1f379 100644 --- a/application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java @@ -953,7 +953,7 @@ public class EntityQueryControllerTest extends AbstractControllerTest { }); - EntityCountQuery countQuery = new EntityCountQuery(entityTypeFilter); + EntityCountQuery countQuery = new EntityCountQuery(entityTypeFilter, keyFilters); countByQueryAndCheck(countQuery, 97); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/cf/CalculatedFieldRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/cf/CalculatedFieldRepository.java index 8ccdb88db0..7755ef036b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/cf/CalculatedFieldRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/cf/CalculatedFieldRepository.java @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.cf; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.thingsboard.server.common.data.id.CalculatedFieldId; import org.thingsboard.server.dao.model.sql.CalculatedFieldEntity; @@ -36,7 +37,10 @@ public interface CalculatedFieldRepository extends JpaRepository findAllByTenantId(UUID tenantId, Pageable pageable); - Page findAllByTenantIdAndEntityId(UUID tenantId, UUID entityId, Pageable pageable); + @Query("SELECT cf FROM CalculatedFieldEntity cf WHERE cf.tenantId = :tenantId " + + "AND cf.entityId = :entityId " + + "AND (:textSearch IS NULL OR ilike(cf.name, CONCAT('%', :textSearch, '%')) = true)") + Page findAllByTenantIdAndEntityId(UUID tenantId, UUID entityId, String textSearch, Pageable pageable); List findAllByTenantId(UUID tenantId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/cf/JpaCalculatedFieldDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/cf/JpaCalculatedFieldDao.java index 2632b0237b..385839dded 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/cf/JpaCalculatedFieldDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/cf/JpaCalculatedFieldDao.java @@ -85,7 +85,7 @@ public class JpaCalculatedFieldDao extends JpaAbstractDao findAllByEntityId(TenantId tenantId, EntityId entityId, PageLink pageLink) { log.debug("Try to find calculated fields by entityId[{}] and pageLink [{}]", entityId, pageLink); - return DaoUtil.toPageData(calculatedFieldRepository.findAllByTenantIdAndEntityId(tenantId.getId(), entityId.getId(), DaoUtil.toPageable(pageLink))); + return DaoUtil.toPageData(calculatedFieldRepository.findAllByTenantIdAndEntityId(tenantId.getId(), entityId.getId(), pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override diff --git a/dao/src/test/java/org/thingsboard/server/dao/AbstractRedisClusterContainer.java b/dao/src/test/java/org/thingsboard/server/dao/AbstractRedisClusterContainer.java index a1009cd255..5ffb9f90f7 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/AbstractRedisClusterContainer.java +++ b/dao/src/test/java/org/thingsboard/server/dao/AbstractRedisClusterContainer.java @@ -31,7 +31,7 @@ import java.util.concurrent.TimeUnit; public class AbstractRedisClusterContainer { static final String NODES = "127.0.0.1:6371,127.0.0.1:6372,127.0.0.1:6373,127.0.0.1:6374,127.0.0.1:6375,127.0.0.1:6376"; - static final String IMAGE = "bitnami/valkey-cluster:8.0"; + static final String IMAGE = "bitnamilegacy/valkey-cluster:8.0"; static final Map ENVS = Map.of( "VALKEY_CLUSTER_ANNOUNCE_IP", "127.0.0.1", "VALKEY_CLUSTER_DYNAMIC_IPS", "no", diff --git a/dao/src/test/java/org/thingsboard/server/dao/AbstractRedisContainer.java b/dao/src/test/java/org/thingsboard/server/dao/AbstractRedisContainer.java index 58843a4651..4b5729fcc6 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/AbstractRedisContainer.java +++ b/dao/src/test/java/org/thingsboard/server/dao/AbstractRedisContainer.java @@ -27,7 +27,7 @@ import java.util.List; public class AbstractRedisContainer { @ClassRule(order = 0) - public static GenericContainer redis = new GenericContainer("bitnami/valkey:8.0") + public static GenericContainer redis = new GenericContainer("bitnamilegacy/valkey:8.0") .withEnv("ALLOW_EMPTY_PASSWORD","yes") .withLogConsumer(s -> log.warn(((OutputFrame) s).getUtf8String().trim())) .withExposedPorts(6379); diff --git a/dao/src/test/java/org/thingsboard/server/dao/RedisJUnit5Test.java b/dao/src/test/java/org/thingsboard/server/dao/RedisJUnit5Test.java index 5d43ffb4ae..0def73f9e9 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/RedisJUnit5Test.java +++ b/dao/src/test/java/org/thingsboard/server/dao/RedisJUnit5Test.java @@ -33,7 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat; public class RedisJUnit5Test { @Container - private static final GenericContainer REDIS = new GenericContainer("bitnami/valkey:8.0") + private static final GenericContainer REDIS = new GenericContainer("bitnamilegacy/valkey:8.0") .withEnv("ALLOW_EMPTY_PASSWORD","yes") .withLogConsumer(s -> log.error(((OutputFrame) s).getUtf8String().trim())) .withExposedPorts(6379); diff --git a/docker/docker-compose.kafka.yml b/docker/docker-compose.kafka.yml index 026070cc89..06bafafc61 100644 --- a/docker/docker-compose.kafka.yml +++ b/docker/docker-compose.kafka.yml @@ -17,7 +17,7 @@ services: kafka: restart: always - image: "bitnami/kafka:4.0" + image: "bitnamilegacy/kafka:4.0" ports: - "9092:9092" env_file: diff --git a/docker/docker-compose.valkey-cluster.yml b/docker/docker-compose.valkey-cluster.yml index 242fabf44b..b8ce0f96ec 100644 --- a/docker/docker-compose.valkey-cluster.yml +++ b/docker/docker-compose.valkey-cluster.yml @@ -18,7 +18,7 @@ services: # Valkey cluster # The latest version of Valkey compatible with ThingsBoard is 8.0 valkey-node-0: - image: bitnami/valkey-cluster:8.0 + image: bitnamilegacy/valkey-cluster:8.0 volumes: - ./tb-node/valkey-cluster-data-0:/bitnami/valkey/data environment: @@ -26,7 +26,7 @@ services: - 'VALKEY_NODES=valkey-node-0 valkey-node-1 valkey-node-2 valkey-node-3 valkey-node-4 valkey-node-5' valkey-node-1: - image: bitnami/valkey-cluster:8.0 + image: bitnamilegacy/valkey-cluster:8.0 volumes: - ./tb-node/valkey-cluster-data-1:/bitnami/valkey/data depends_on: @@ -36,7 +36,7 @@ services: - 'VALKEY_NODES=valkey-node-0 valkey-node-1 valkey-node-2 valkey-node-3 valkey-node-4 valkey-node-5' valkey-node-2: - image: bitnami/valkey-cluster:8.0 + image: bitnamilegacy/valkey-cluster:8.0 volumes: - ./tb-node/valkey-cluster-data-2:/bitnami/valkey/data depends_on: @@ -46,7 +46,7 @@ services: - 'VALKEY_NODES=valkey-node-0 valkey-node-1 valkey-node-2 valkey-node-3 valkey-node-4 valkey-node-5' valkey-node-3: - image: bitnami/valkey-cluster:8.0 + image: bitnamilegacy/valkey-cluster:8.0 volumes: - ./tb-node/valkey-cluster-data-3:/bitnami/valkey/data depends_on: @@ -56,7 +56,7 @@ services: - 'VALKEY_NODES=valkey-node-0 valkey-node-1 valkey-node-2 valkey-node-3 valkey-node-4 valkey-node-5' valkey-node-4: - image: bitnami/valkey-cluster:8.0 + image: bitnamilegacy/valkey-cluster:8.0 volumes: - ./tb-node/valkey-cluster-data-4:/bitnami/valkey/data depends_on: @@ -66,7 +66,7 @@ services: - 'VALKEY_NODES=valkey-node-0 valkey-node-1 valkey-node-2 valkey-node-3 valkey-node-4 valkey-node-5' valkey-node-5: - image: bitnami/valkey-cluster:8.0 + image: bitnamilegacy/valkey-cluster:8.0 volumes: - ./tb-node/valkey-cluster-data-5:/bitnami/valkey/data depends_on: diff --git a/docker/docker-compose.valkey-sentinel.yml b/docker/docker-compose.valkey-sentinel.yml index 3827e0358b..e528a1bb9a 100644 --- a/docker/docker-compose.valkey-sentinel.yml +++ b/docker/docker-compose.valkey-sentinel.yml @@ -18,7 +18,7 @@ services: # Valkey sentinel # The latest version of Valkey compatible with ThingsBoard is 8.0 valkey-primary: - image: 'bitnami/valkey:8.0' + image: 'bitnamilegacy/valkey:8.0' volumes: - ./tb-node/valkey-sentinel-data-primary:/bitnami/valkey/data environment: @@ -26,7 +26,7 @@ services: - 'VALKEY_PASSWORD=thingsboard' valkey-replica: - image: 'bitnami/valkey:8.0' + image: 'bitnamilegacy/valkey:8.0' volumes: - ./tb-node/valkey-sentinel-data-replica:/bitnami/valkey/data environment: @@ -38,7 +38,7 @@ services: - valkey-primary valkey-sentinel: - image: 'bitnami/valkey-sentinel:8.0' + image: 'bitnamilegacy/valkey-sentinel:8.0' volumes: - ./tb-node/valkey-sentinel-data-sentinel:/bitnami/valkey/data environment: diff --git a/docker/docker-compose.valkey.yml b/docker/docker-compose.valkey.yml index d4a620820d..3eba086a9b 100644 --- a/docker/docker-compose.valkey.yml +++ b/docker/docker-compose.valkey.yml @@ -19,7 +19,7 @@ services: # The latest version of Valkey compatible with ThingsBoard is 8.0 valkey: restart: always - image: bitnami/valkey:8.0 + image: bitnamilegacy/valkey:8.0 environment: # ALLOW_EMPTY_PASSWORD is recommended only for development. ALLOW_EMPTY_PASSWORD: "yes" diff --git a/msa/black-box-tests/src/test/resources/docker-compose.valkey-ssl.yml b/msa/black-box-tests/src/test/resources/docker-compose.valkey-ssl.yml index 8c3029cda1..710dab4690 100644 --- a/msa/black-box-tests/src/test/resources/docker-compose.valkey-ssl.yml +++ b/msa/black-box-tests/src/test/resources/docker-compose.valkey-ssl.yml @@ -19,7 +19,7 @@ services: # The latest version of Valkey compatible with ThingsBoard is 8.0 valkey: restart: always - image: bitnami/valkey:8.0 + image: bitnamilegacy/valkey:8.0 environment: # ALLOW_EMPTY_PASSWORD is recommended only for development. - 'ALLOW_EMPTY_PASSWORD=yes' diff --git a/ui-ngx/src/app/modules/home/components/rule-node/external/ai-config.component.ts b/ui-ngx/src/app/modules/home/components/rule-node/external/ai-config.component.ts index 4989325801..bfba25afa1 100644 --- a/ui-ngx/src/app/modules/home/components/rule-node/external/ai-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/rule-node/external/ai-config.component.ts @@ -79,6 +79,9 @@ export class AiConfigComponent extends RuleNodeConfigurationComponent { if (!this.aiConfigForm.get('systemPrompt').value) { delete config.systemPrompt; } + if (this.aiConfigForm.get('responseFormat.type').value !== ResponseFormat.JSON_SCHEMA) { + delete config.responseFormat.schema; + } return deepTrim(config); } @@ -88,10 +91,10 @@ export class AiConfigComponent extends RuleNodeConfigurationComponent { if (this.aiConfigForm.get('responseFormat.type').value !== ResponseFormat.TEXT) { this.aiConfigForm.get('responseFormat.type').patchValue(ResponseFormat.TEXT, {emitEvent: true}); } - this.aiConfigForm.get('responseFormat.type').disable(); + this.aiConfigForm.get('responseFormat.type').disable({emitEvent: false}); } } else { - this.aiConfigForm.get('responseFormat.type').enable(); + this.aiConfigForm.get('responseFormat.type').enable({emitEvent: false}); } }