diff --git a/packages/api-database/source/migrations/1729064427168-CreateUpdateValidatorRankingFunction.ts b/packages/api-database/source/migrations/1729064427168-CreateUpdateValidatorRankingFunction.ts index bcfbd4759d..bba241f305 100644 --- a/packages/api-database/source/migrations/1729064427168-CreateUpdateValidatorRankingFunction.ts +++ b/packages/api-database/source/migrations/1729064427168-CreateUpdateValidatorRankingFunction.ts @@ -13,7 +13,7 @@ export class CreateUpdateValidatorRankingFunction1729064427168 implements Migrat (attributes->>'validatorVoteBalance')::numeric AS vote_balance, COALESCE((attributes->>'validatorResigned')::boolean, FALSE) AS is_resigned FROM wallets - WHERE attributes ? 'validatorPublicKey' + WHERE attributes ? 'validatorPublicKey' AND attributes->>'validatorPublicKey' <> '' ), ranking AS ( SELECT diff --git a/packages/api-database/source/search/filters/validator-filter.ts b/packages/api-database/source/search/filters/validator-filter.ts index 611dd8f205..32adf385b4 100644 --- a/packages/api-database/source/search/filters/validator-filter.ts +++ b/packages/api-database/source/search/filters/validator-filter.ts @@ -23,6 +23,12 @@ export class ValidatorFilter { { expressions: [ { attribute: "validatorPublicKey", op: "jsonbAttributeExists", property: "attributes" }, + { + jsonFieldAccessor: { fieldName: "validatorPublicKey", operator: "->>" }, + op: "notEqual", + property: "attributes", + value: "", + }, ], op: "and", }, diff --git a/packages/api-database/source/search/query-helper.ts b/packages/api-database/source/search/query-helper.ts index d1fff97194..bc1d48fc0c 100644 --- a/packages/api-database/source/search/query-helper.ts +++ b/packages/api-database/source/search/query-helper.ts @@ -75,6 +75,13 @@ export class QueryHelper { const parameters = { [parameter]: expression.value }; return { parameters, query }; } + case "notEqual": { + const column = this.getColumnName(metadata, expression.property, expression.jsonFieldAccessor); + const parameter = `p${this.paramNo++}`; + const query = `${column} <> :${parameter}`; + const parameters = { [parameter]: expression.value }; + return { parameters, query }; + } case "between": { const column = this.getColumnName(metadata, expression.property, expression.jsonFieldAccessor); const parameterFrom = `p${this.paramNo++}`; diff --git a/packages/api-database/source/search/types/expressions.ts b/packages/api-database/source/search/types/expressions.ts index 0dfbcd0e07..1234e3a2c5 100644 --- a/packages/api-database/source/search/types/expressions.ts +++ b/packages/api-database/source/search/types/expressions.ts @@ -13,6 +13,13 @@ export type EqualExpression = { value: any; }; +export type NotEqualExpression = { + property: keyof TEntity; + jsonFieldAccessor?: JsonFieldAccessor; + op: "notEqual"; + value: any; +}; + export type BetweenExpression = { property: keyof TEntity; jsonFieldAccessor?: JsonFieldAccessor; @@ -75,6 +82,7 @@ export type Expression = | TrueExpression | FalseExpression | EqualExpression + | NotEqualExpression | BetweenExpression | GreaterThanEqualExpression | LessThanEqualExpression diff --git a/packages/api-http/source/controllers/validators.ts b/packages/api-http/source/controllers/validators.ts index 7ce960cac8..77bafe5aa5 100644 --- a/packages/api-http/source/controllers/validators.ts +++ b/packages/api-http/source/controllers/validators.ts @@ -109,6 +109,7 @@ export class ValidatorsController extends Controller { .createQueryBuilder() .select() .where("attributes ? :validatorPublicKey", { validatorPublicKey: "validatorPublicKey" }) + .andWhere("attributes->>:validatorPublicKey <> ''", { validatorPublicKey: "validatorPublicKey" }) .andWhere( new ApiDatabaseContracts.Brackets((query) => { query