Datasets Avançados não consideram constraints. Seria boa prática este 'workaround'?

Pra mim a sua solução é bem ruim, pois você está montando um SQL que é facilmente encontrado no código e alguém com conhecimento pode criar qualquer SQL e passar pro seu dataset pra obter o que quiser. É uma grande falha de segurança.

Quanto ao seu problema você precisa validar o tipo da Constraint e tratar os casos.


let arrayConstraints = [
    DatasetFactory.createConstraint(
        "ANO_MES",
        "2022-01",
        "2022-01",
        ConstraintType.MUST
    ),
    DatasetFactory.createConstraint(
        "CATEGORIA",
        "CONS",
        "CONS",
        ConstraintType.MUST_NOT
    )
];

let arrayOrdenacao= ["NOME"];

let resultado = DatasetFactory.getDataset(
        "meu_dataset",
        null, 
        arrayConstraints, 
        arrayOrdenacao
);

No seu código você indicou que a Constraint ANO_MES é MUST e a Constraint CATEGORIA é MUST_NOT.

No seu Dataset você precisa tratar isso.

Exemplo:

var clausulas = [];
var comparacao = "";

if (constraints !== null) {
    for (var i = 0; i < constraints.length; i++) {
        comparacao = constraints[i].constraintType == ConstraintType.MUST ? " = " : " <> ";

        if (constraints[i].fieldName == "ANO_MES") {
            clausulas.push("anoMes " + comparacao + "'" + constraints[i].initialValue + "'");
        }

        if (constraints[i].fieldName == "CATEGORIA ") {
            clausulas.push("CATEGORIA " + comparacao + "'" + constraints[i].initialValue + "'");
        }
}

var sql = "SELECT * FROM TABELA WHERE " + clausulas.join(" AND ");

É uma atividade bem complicada em Dataset Avançado tratar todas as possibilidades de Constraints, então é bom analisar bem cada caso.

Por exemplo, se a pessoa colocar uma constraint SHOULD você teria que tratar com um OR na consulta e pode ir complicando cada vez mais.

Por isso é interessante definir bem a regra de negócio para o uso do Dataset pra não deixar a implementação complicada demais.

1 curtida