Soporte de búsqueda paramétrica
Una búsqueda paramétrica permite que las consultas que utilizan varios criterios reduzcan los resultados. Por ejemplo, todos los productos que tengan un nombre que empiece por "Juguete", de menos de 50 euros, que tengan el color = "azul". WebSphere Commerce soporta consultas de búsqueda paramétrica en esquemas verticales y horizontales.
En la base de datos, los atributos de búsqueda se almacenan en el esquema horizontal y, de este modo, cada atributo distinto tiene una columna específica donde se almacena. Por ejemplo, los productos tienen una columna PARTNUMBER. Si en vez de esto se almacenan en el esquema vertical, las columnas no son específicas y se pueden almacenar distintos atributos en cada fila. Por ejemplo, el producto puede tener dos filas de atributos asociadas a él, color = azul y tamaño = grande.
Para un rendimiento óptimo, los atributos que se pueden buscar han de estar almacenados en las tablas de esquema horizontal. Dichas tablas pueden incluir la tabla base para almacenar información sobre un producto como un número de pieza o una marca, o tablas asociadas para almacenar datos localizados como, por ejemplo, descripciones.
- Las consultas de búsqueda paramétrica deben utilizar consultas de dos pasos.
- Las consultas de búsqueda paramétrica no deben especificar las sentencias SQL paging_count (cuenta de paginación).
La función search()
search() es una función especial que forma parte de una Notación XPath ampliada de HCL Commerce. Esta función se puede utilizar para reducir el número de consultas de búsqueda paramétrica que necesita crear un desarrollador.
La función de búsqueda se puede poner en una expresión XPath en el predicado (la serie entre corchetes del ejemplo siguiente) del nombre. El argumento para la función search(), junto con la correlación entre los objetos SDO de modelo lógico y el esquema de base de datos se utilizan para generar fragmentos de SQL que se inyectan en las plantillas de las consultas de búsqueda paramétrica.
/CatalogEntry[search(contains(Description/ShortDescription, "Polo shirt") and starts-with(CatalogEntryIdentifier/ExternalIdentifier/PartNumber, "FU01"))]
<_config:mapping>
<_config:key name="CatalogEntry"/>
<_config:basetable name="CATENTRY" useAllColumns="false">
<_config:columns name="PARTNUMBER" propertyName="CatalogEntryIdentifier/ExternalIdentifier/PartNumber"/>
<_config:columns name="MFPARTNUMBER" propertyName="CatalogEntryAttribute/Attributes/mfPartNumber"/>
<_config:columns name="MFNAME" propertyName="CatalogEntryAttribute/Attributes/mfName"/>
<_config:associatedtable name="CATENTDESC" useAllColumns="false">
<_config:columns name="NAME" propertyName="Description/Name"/>
<_config:columns name="SHORTDESCRIPTION" propertyName="Description/ShortDescription"/>
<_config:columns name="PUBLISHED" propertyName="Description/Attributes/published"/>
</_config:associatedtable>
</_config:basetable>
</_config:mapping>
La plantilla XPath a SQL con una función search() tiene el aspecto siguiente:BEGIN_XPATH_TO_SQL_STATEMENT
name=/CatalogEntry[search()]
base_table=CATENTRY
sql=
SELECT DISTINCT CATENTRY.$COLS:CATENTRY_ID$
FROM
CATENTRY, $ATTR_TBLS$
WHERE
CATENTRY.MARKFORDELETE = 0 AND
( $ATTR_CNDS$ )
ORDER BY
CATENTRY.CATENTRY_ID
END_XPATH_TO_SQL_STATEMENT
SELECT DISTINCT CATENTRY.CATENTRY_ID
FROM
CATENTRY, CATENTDESC IBM_1
WHERE
CATENTRY.MARKFORDELETE = 0 AND CATENTRY.PARTNUMBER LIKE 'FU01%' AND
(CATENTRY.CATENTRY_ID= IBM_1.CATENTRY_ID AND
IBM_1.SHORTDESCRIPTION LIKE '%Polo shirt%')
ORDER BY
CATENTRY.CATENTRY_ID
Configuración de la búsqueda paramétrica
- Información de mediador de datos
- Información de contexto
- Información de correlación de atributos
<dataservice>
. En el siguiente ejemplo de XML puede ver un ejemplo de la configuración:<_config:dataservice dataMediatorType="JDBC"
metadataClass="com.ibm.commerce.catalog.facade.server.metadata.CatalogMetadata"
maximumPagingResultLimit="2000">
<_config:context key="LANG_ID"
name="com.ibm.commerce.context.globalization.GlobalizationContext"
propertyName="languageId" defaultValue="-1"/>
<_config:context key="CATALOG_ID"
name="com.ibm.commerce.catalog.businesscontext.CatalogContext"
propertyName="catalogID" defaultValue="-1"/>
<_config:context key="OWNER_ID"
name="com.ibm.commerce.catalog.businesscontext.CatalogContext"
propertyName="ownerID" defaultValue="-1"/>
<_config:context key="STORE_ID"
name="com.ibm.commerce.context.base.BaseContext"
propertyName="storeId" defaultValue="-1"/>
<!-- Mapping for catentry search -->
<_config:mapping>
<_config:key name="CatalogEntry"/>
<_config:basetable name="CATENTRY" useAllColumns="false">
<_config:columns name="PARTNUMBER" propertyName="CatalogEntryIdentifier/ExternalIdentifier/PartNumber"/>
<_config:columns name="MFPARTNUMBER" propertyName="CatalogEntryAttribute/Attributes/mfPartNumber"/>
<_config:columns name="MFNAME" propertyName="CatalogEntryAttribute/Attributes/mfName"/>
<_config:associatedtable name="CATENTDESC" useAllColumns="false">
<_config:columns name="NAME" propertyName="Description/Name"/>
<_config:columns name="SHORTDESCRIPTION" propertyName="Description/ShortDescription"/>
<_config:columns name="PUBLISHED" propertyName="Description/Attributes/published"/>
</_config:associatedtable>
</_config:basetable>
</_config:mapping>
<!-- Mapping for catgroup search -->
<_config:mapping>
<_config:key name="CatalogGroup"/>
<_config:basetable name="CATGROUP" useAllColumns="false">
<_config:columns name="IDENTIFIER" propertyName="CatalogGroupIdentifier/ExternalIdentifier/GroupIdentifier"/>
<_config:associatedtable name="CATGRPDESC" useAllColumns="false">
<_config:columns name="NAME" propertyName="Description/Name"/>
<_config:columns name="SHORTDESCRIPTION" propertyName="Description/ShortDescription"/>
</_config:associatedtable>
</_config:basetable>
</_config:mapping>
</_config:dataservice>
- Tipo de mediador de datos: solo se da soporte a JDBC.
- Clase de metadatos: nombre completo de la clase de metadatos que proporciona información de los metadatos relacionales de objetos. Esta clase debe convertirse en subclase a partir de com.ibm.commerce.dataservice.db.jdbc.ComponentMetadata
- Clave: Este es un identificador exclusivo que representa la información de contexto. Esta clave se utiliza en el archivo de plantilla de consulta como serie de caracteres de sustitución.
- Nombre: Este es el nombre de contexto definido en el servicio de contexto de negocio.
- Nombre de propiedad: Este identifica la propiedad dentro de contexto que contiene los datos. La clase de implementación de contexto ha de tener un método getter para esa propiedad.
- Valor predeterminado de : este valor se utiliza como sustituto en la sentencia SQL de la plantilla si el valor de contexto no se ha establecido en el tiempo de ejecución.
Correlación de atributo
- Tabla base: contiene información de la identidad exclusiva del dominio. Cada columna puede representar una propiedad del objeto lógico (la tabla base representa normalmente el nombre del usuario).
- Tabla asociada: propiedades adicionales almacenadas en una tabla distinta como parte del esquema horizontal. Esta tabla tiene una relación de clave externa con la tabla base. Cada columna puede representar una propiedad del objeto lógico.
- Tabla de propiedades: propiedades adicionales almacenadas en una tabla distinta como parte del esquema horizontal. Cada fila puede representar una pareja propiedad/valor del objeto lógico. Esta tabla tiene una relación de clave externa con la tabla base.
<_config:mapping>
<_config:key name="CatalogEntry"/>
<_config:basetable name="CATENTRY" useAllColumns="false">
<_config:columns name="PARTNUMBER" propertyName="CatalogEntryIdentifier/ExternalIdentifier/PartNumber"/>
<_config:columns name="MFPARTNUMBER" propertyName="CatalogEntryAttribute/Attributes/mfPartNumber"/>
<_config:columns name="MFNAME" propertyName="CatalogEntryAttribute/Attributes/mfName"/>
<_config:associatedtable name="CATENTDESC" useAllColumns="false">
<_config:columns name="NAME" propertyName="Description/Name"/>
<_config:columns name="SHORTDESCRIPTION" propertyName="Description/ShortDescription"/>
<_config:columns name="PUBLISHED" propertyName="Description/Attributes/published"/>
</_config:associatedtable>
<_config:propertyTable name="CEPROPERTY">
<_config:columns name="NAME" propertyName=".name."/>
<_config:columns name="VALUE" propertyName=".value."/>
</_config:propertyTable>
</_config:basetable>
</_config:mapping>
Cada elemento de la correlación define una correlación de un objeto lógico con varias tablas físicas. El elemento clave identifica la propiedad del modelo lógico que hace referencia al objeto de la entidad lógica.
Element | Atributo | Descripción: |
---|---|---|
basetable | Identifica la tabla base | |
name | Nombre de la tabla | |
useAllColumn | Indica si todas las columnas de la tabla se utilizan para la búsqueda paramétrica. Los valores de atributo son:
|
|
columns | Subelemento de la tabla base, y la tabla asociada que identifica la información de columna de estas tablas. | |
name | Nombre de la columna. | |
propertyname | El nombre de la propiedad XPath, si se ha especificado. De lo contrario, se utiliza el nombre de propiedad definido para esta columna en los metadatos relacionales de objeto. | |
searchable | Especifica si se utiliza para la búsqueda paramétrica. | |
caseSensitive | Especifica si las búsquedas han de tratar el valor de esta columna como sensible a las mayúsculas y minúsculas o no sensible a las mayúsculas y minúsculas.
|
|
genmode | Especifica la modalidad de generación. | |
associatedtable | Define la tabla asociada. Los atributos de este elemento son iguales que para el elemento basetable. | |
propertytable | Define la tabla de propiedades. Únicamente se soporta el atributo del nombre. | |
columns | Subelemento de la tabla de propiedades (propertytable) y que identifica la información de columna para estas tablas. | |
name | Nombre de la columna. | |
propertyname | Nombre de propiedad de modelo lógico. |
Modalidades de generación.
- Modalidad UNION: se genera una consulta para cada parámetro de búsqueda. El resultado se combina utilizando el operador SQL UNION. Por ejemplo:
select distinct ce.id, ce.partnumber from catentry ce where ce.partnumber like 'FU01%' union select distinct ce.catentry_id, ce.partnumber from catentry ce, catentdesc d where ce.catentry_id = d.catentry_id and d.shortdescription like '%shirt%'
- Modalidad EXISTS: se genera una sola consulta utilizando la condición EXISTS. Por ejemplo, el ejemplo anterior se generará como:
select distinct ce.catentry_id, ce.partnumber from catentry ce where ce.partnumber like 'FU01%' or exists(select distinct * from catentdesc d where ce.catentry_id=d.catentry_id and d.shortdescription like '%shirt%')
- Modalidad IN: se genera una sola consulta utilizando la condición IN. Por ejemplo, el ejemplo anterior se generará como:
select distinct ce.catentry_id, ce.partnumber from catentry ce where ce.partnumber like 'FU01%' or ce.catentry_id in (select distinct d.catentry_id from catentdesc d where ce.catentry_id=d.catentry_id and d.shortdescription like '%shirt%')
Modalidad de generación | valor del atributo genmode |
---|---|
UNION | 0 |
EXISTS | 1 |
IN | 2 |
Alteración temporal del SQL generado para consultas de búsqueda paramétrica
Puede alterar temporalmente el SQL generado para consultas de búsqueda paramétrica. Por ejemplo, si una determinada búsqueda paramétrica no se está ejecutando correctamente, el administrador de base de datos puede sugerir otro modo de escribir el SQL. En este caso, puede alterar completamente el SQL utilizado para la consulta de búsqueda paramétrica.
Para alterar temporalmente el SQL generado, lo único que hay que hacer es definir un nuevo bloque XPATH_TO_SQL_STATEMENT en el archivo de plantilla personalizado. El nombre de consulta ha de ser la clave XPath, con los parámetros de búsqueda especificados explícitamente. Se utiliza esta consulta en lugar de generar el SQL.
A continuación de la expresión de ejemplo que se ha estado utilizando en esta sección, el nombre (y el SQL de alteración temporal, serán como los del siguiente ejemplo:
BEGIN_XPATH_TO_SQL_STATEMENT
name=/CatalogEntry[search(contains(Description/ShortDescription,) and starts-with(CatalogEntryIdentifier/ExternalIdentifier/PartNumber,))]
base_table=CATENTRY
sql=
SELECT DISTINCT CATENTRY.CATENTRY_ID
FROM
CATENTRY, CATENTDESC IBM_1
WHERE
CATENTRY.MARKFORDELETE = 0 AND CATENTRY.PARTNUMBER LIKE '?CatalogEntryIdentifier/ExternalIdentifier/PartNumber?%' AND
(CATENTRY.CATENTRY_ID= IBM_1.CATENTRY_ID AND
IBM_1.SHORTDESCRIPTION LIKE '%?Description/ShortDescription?%')
ORDER BY
CATENTRY.CATENTRY_ID
END_XPATH_TO_SQL_STATEMENT