Skip to content

Xapar els "IN" en blocs de mil. #189

Description

@anadal-fundaciobit

Pareix ser que certes BBDD no suporten més de mil elements dins dels camps "IN" aplicar el workaround que es va fe rper PORTAFIB.

A més en el cas de més de 1000 elements escriure un log avisant que es millori aquest sistema ja que una consulta IN amb més de 1000 elements no es eficient.

/**
     * Workaround per https://github.com/GovernIB/genapp/issues/39
     * Crea una Where de tipus IN dividida en blocs de màxim 1000.
     * @param field camp a emprar
     * @param values llista de valors a comprovar dins l'IN
     * @return un where que el camp field està dins values.
     */
    public static <C> Where getSafeWhereIn(Field<C> field, List<C> values) {
        final int MAX_IN_SIZE = 1000;
        Where whereIn;
        if (values.size() < MAX_IN_SIZE) {
            whereIn = field.in(values);
        } else {
            int iterations = ((values.size() - 1) / MAX_IN_SIZE) + 1;
            Where[] wheresIn = new Where[iterations];
            for (int i = 0; i < iterations; i++) {
                int firstIndex = i * MAX_IN_SIZE;
                int lastIndex = Math.min(firstIndex + MAX_IN_SIZE, values.size());
                wheresIn[i] = field.in(values.subList(firstIndex, lastIndex));
            }
            whereIn = Where.OR(wheresIn);
        }
        return whereIn;
    }

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status
    To do

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions