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.

Nota:
  • 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.

Nota: La función de búsqueda también tiene soporte para las condiciones 'and' y 'or'. Sin embargo, 'and' y 'or' no se pueden utilizar en la función de búsqueda simultáneamente.
En el siguiente ejemplo, una expresión XPath de búsqueda paramétrica consulta productos que tengan una descripción breve con la serie de caracteres "Polo shirt" y números de pieza que empiecen por "FU01":
/CatalogEntry[search(contains(Description/ShortDescription, "Polo shirt") and starts-with(CatalogEntryIdentifier/ExternalIdentifier/PartNumber, "FU01"))]
El atributo correlacionado con la entidad lógica CatalogEntry que se muestra abajo, define CATENTRY como una tabla base y CATENTDESC como tabla asociada. El elemento ‘Description/ShortDescription‘ (nombre de propiedad) correlacionado se busca en los elementos de 'columnas' de la tabla base. Si no se encuentra ninguna coincidencia, se busca en la tabla asociada CATENTDESC.
<_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

En la siguiente sentencia SQL generada, la variable $ATTR_TBLS$ se sustituye por la tabla asociada que contiene la columna correspondiente en la propiedad ‘Description/ShortDescription' tal como se ha definido en la correlación anterior. La variable $ATTR_CNDS$ se sustituye por la condición de unión entre esta tabla y la tabla base y la condición para comparar la columna ‘SHORTDESCRIPTION’ (descripción breve) con el valor de descripción breve proporcionado como entrada. También se incluye la condición para la propiedad ‘CatalogEntryIdentifier/ExternalIdentifier’ que corresponde a la columna PARTNUMBER en la tabla base CATENTRY.
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 
Nota: La función search() solo puede hacer referencia a las propiedades correlacionadas con las columnas de la tabla base que representen el objeto de entidad lógica o las columnas que tengan relaciones de clave foránea con la tabla base. Por ejemplo, la función search() utilizada en el predicado del elemento 'Catalog' pueden referirse a la propiedad 'description' del catálogo. Sin embargo, no debe hacer hacer referencia a la propiedad de descripción de las entradas de catálogo. Asimismo, la función search() se limita a un solo elemento en la expresión XPath. Solo se tiene en cuenta la primera aparición de la función search() cuando se generan fragmentos de SQL para búsquedas generadas.

Configuración de la búsqueda paramétrica

El archivo de configuración de componentes, wc-component.xml, contiene una sección para la capa de servicios de datos. Se puede dividir en 3 subsecciones principales:
  • Información de mediador de datos
  • Información de contexto
  • Información de correlación de atributos
Esta configuración la describe el elemento <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>

La sección de mediador de datos define la información siguiente:
  • 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
Se utilizan estas definiciones de contexto para recuperar los datos de contexto en el tiempo de ejecución y sustituirlos en la sentencia de SQL de plantilla. La sección de información de contexto tiene la siguiente información:
  • 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

Un solo objeto lógico tiene propiedades almacenadas en varias tablas físicas. DSL tiene soporte para 3 tipos de tabla distintos:
  1. 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).
  2. 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.
  3. 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.
El siguiente XML es un ejemplo de configuración de correlación de atributo.
<_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:
  • true - se utilizan todas las columnas de la tabla. La correlación de nombre de propiedad lógica con el nombre de columna se basa en la información de metadatos relacionales de objeto a menos que los subelementos de columnas (descritos más adelante) los alteren temporalmente de manera explícita. El atributo useAllColumn es opcional. Si no se especifica lo contrario, éste es el valor predeterminado.
  • false - únicamente se tienen en cuenta las columnas identificadas en los subelementos de las columnas.
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.
  • true - el contenido de esta columna se considera sensible a las mayúsculas y minúsculas. Es el valor predeterminado.
  • false - el contenido de esta columna no es sensible a las mayúsculas y minúsculas. Cuando el atributo caseSensitive se establece en false, la función UPPER() SQL se utiliza en la sentencia SQL generada para cambiar las mayúsculas/minúsculas del contenido de la columna. Los usuarios han de tener en cuenta el impacto sobre el rendimiento que supone la realización de búsquedas no sensible a las mayúsculas y minúsculas. La utilización de la función UPPER() producirá una exploración de índice completa o incluso una exploración de tabla. Para usuarios de Oracle, es aconsejable utilizar un índice basado en la función para mejorar el rendimiento.
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.

Cuando los atributos de búsqueda están conectados mediante el operador lógico ‘or', varias opciones de generación de consulta de búsqueda se pueden seleccionar por configuración. Las diferentes modalidades de generación le permiten ajustar con precisión el rendimiento de las consultas generadas. Por ejemplo, con conjuntos de datos grandes, si se divide una sola consulta de búsqueda en varias consultas y se combina el conjunto de resultados utilizando el operador UNION, es posible que se obtenga el mejor rendimiento. Las siguientes modalidades de generación se pueden especificar utilizando el atributo genmode del elemento columns.
  • 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
La modalidad UNION es la modalidad predeterminada. Se utiliza si no se ha especificado ninguna configuración. También se utiliza si por lo menos uno de los atributos de búsqueda se ha configurado para utilizar la modalidad UNION. La modalidad EXISTS se utiliza si uno de los atributos de búsqueda se ha configurado para la modalidad EXISTS y no se ha configurado ninguno para la modalidad UNION. La modalidad IN se utiliza si todos los atributos de búsqueda se han configurado para utilizarla.

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