Forum Stats

  • 3,874,575 Users
  • 2,266,762 Discussions
  • 7,911,901 Comments

Discussions

Apex - Búsqueda facetada - Faceta dependiente

hlopez
hlopez Member Posts: 15 Blue Ribbon

¿Hay alguna forma de evitar, en tiempo de ejecución, la generación de una faceta?

Si bien existe la opción para hacer depender una faceta de otra (y con eso se lograría lo que busco) APEX igual genera la faceta, sólo que no la muestra. En mi caso, eso hace que la aplicación sea innecesariamente lenta.

Explicación larga:

Armé un caso de ejemplo en apex.oracle.com que tiene una tabla de documentos con una columna para el título, una columna para un código de tema y una de tipo de documento. Por otro lado, está la tabla de temas, con una columna para el código y otra para la descripción.

La tabla de documentos tiene 25000 filas y la tabla de temas, 8000. Por cómo está armado el ejemplo, cada tema tiene un máximo de 15 documentos asociados. Y cada documento tiene dos tipos posibles (la distribución es 50% y 50% de cada tipo)

Armé una búsqueda facetada que tiene el campo de búsqueda por título y una faceta de tipo y todo funciona bien. El problema está al agregar la faceta de tema.

Armé la faceta con una lista de valores basada en la consulta de la tabla tema. El primer problema es claro: con 8000 temas distintos, no se puede armar una faceta. Entonces, usé la opción "Depende de" poniendo que el campo de búsqueda sea NOT NULL (para que sólo se arme la faceta si se hizo primero una búsqueda). De esta forma, la búsqueda facetada anda casi siempre bien... salvo en el primer acceso o cuando se restablece la consulta.

En ese caso, en que el campo de búsqueda es NULL, la página tarda más en aparecer y, cuando aparece, sólo muestra la faceta de TIPO, por lo que se podría pensar que no se armó la de tema. Pero si se ve el código fuente de la página, aparecen los 8000 temas (que, por otro lado, ni siquiera se podrían mostrar, porque APEX limita a 2000 los valores posibles para una faceta).

El problema con esto es que la página se vuelve mucho más lenta innecesariamente (quizás en apex.oracle.com la demora no es tan notable por lo simple del caso y el hardware disponible, pero en mi caso real, con varias facetas y más complejas, la demora es casi inaceptable y, de nuevo, innecesaria).

Y acá vuelvo a la consulta original: ¿hay una forma real de evitar que se genere una faceta hasta que se cumpla una condición? (y no sólo no mostrarla como entiendo que está haciendo el "Depende de")

Armé una prueba pública en https://apex.oracle.com/pls/apex/r/apex_bcn/prueba-facetas/documentos

Tagged:

Best Answer

  • hlopez
    hlopez Member Posts: 15 Blue Ribbon
    Answer ✓

    Por si le puede servir a alguien más, confirmo que basando la consulta en una tabla que traiga decodificados los valores y usando la opción "valores distintos" sobre la columna de la descripción funciona muchísimo más rápido que usando una LOV para decodificar los valores en la facetas.

Answers

  • hlopez
    hlopez Member Posts: 15 Blue Ribbon

    Investigando un poco más el tema, creo entender que la implementación de Apex de las facetas necesariamente lleva al problema en que me encuentro.

    A diferencia de lo que creí al momento de escribir la pregunta, Apex no arma cada faceta teniendo en cuenta los resultados del reporte, sino que arma las facetas con el 100% de las filas de la LOV o consulta SQL que se indique al armar la faceta. Después se calcula cuántas veces aparece en el reporte cada una de esos valores y finalmente se muestran o no los valores no usados (según lo que indique el usuario). De esta forma, en mi caso la página se armará con los 8000 temas, aunque finalmente muestre sólo 2 o 3...

    Tratándose de Oracle, supongo que detrás de esa implementación habrá alguna explicación lógica... pero yo no logro entenderla. Si la implementación es como la estoy entendiendo, lo mejor sería basar la consulta en una vista que haga la decodificación del tema y usar en "Lista de Valores" la opción "Valores distintos".

  • hlopez
    hlopez Member Posts: 15 Blue Ribbon
    Answer ✓

    Por si le puede servir a alguien más, confirmo que basando la consulta en una tabla que traiga decodificados los valores y usando la opción "valores distintos" sobre la columna de la descripción funciona muchísimo más rápido que usando una LOV para decodificar los valores en la facetas.