Balises dans le fichier de modèle de requête

Le fichier de modèle de requête utilise les balises suivantes :

$CTX:KEY$ - Balises de contexte métier

Le contexte métier fournit aux modules de service des informations communes à plusieurs transactions. Ces transactions peuvent être régies par des contextes divers. Par exemple, le contexte d'habilitation peut spécifier les utilisateurs autorisés à afficher certains produits ou à se prévaloir de prix spéciaux. Le contexte de globalisation a un impact sur la langue et la devise des informations affichées en fonction des paramètres régionaux de l'utilisateur.

La couche service de données aide à extraire de la base de données des informations dépendantes du contexte en permettant au développeur de spécifier une balise spéciale, $CTX:KEY$, dans le modèle SQL. Cette balise est remplacée en phase d'exécution par la valeur de la propriété du contexte (par exemple, l'ID de langue ou de magasin) correspondant à la variable 'KEY'. Le nom de la propriété de contexte doit correspondre à la méthode d'accès get associée dans le contexte. Par exemple, pour obtenir la valeur de BaseContext.getRunAsId(), le nom de la propriété doit être runAsId.

Chaque module de service définit des clés de contexte, et leur mappage avec une propriété de contexte, dans son fichier wc-component.xml pour leur utilisation de la balise CTX:CLE dans les modèles de requête.

Les informations de contexte sont également utilisées lors de la génération de fragments SQL pour interroger des tables stockant des attributs de magasin si ces tables contiennent des informations dépendantes du contexte. Des prédicats supplémentaires sont annexés à la clause 'where'. Ils contiennent les colonnes se rapportant aux informations de contexte définies dans la configuration de mappage d'attributs du fichier de configuration du composant.

La valeur de la propriété de contexte peut être numérique ou de type chaîne. La balise $CTX:CLE$ doit être délimitée dans le modèle SQL par des apostrophes s'il s'agit de propriétés de contexte basées chaîne.

Si la propriété de contexte accepte des valeurs multiples, la condition de contexte dans le modèle SQL utilise le prédicat 'IN' au lieu de l'opérateur '='. Dans ce cas, la balise $CTX:KEY$ sera remplacée par les valeurs au format CSV mentionnées entre les parenthèses. Dans le cas de fragments SQL générés, le prédicat 'IN' est généré.

Le modèle d'instruction SQL ci-dessous interroge tous les groupes de catégories et renvoie leur description dans la langue définie dans le contexte en phase d'exécution. La balise de contexte portant la clé LANG_ID est remplacée par la valeur de l'ID de langue.

Modèle SQL :
SELECT 
CATENTRY.$COLS:CATENTRY$,
CATENTDESC.$COLS:CATENTDESC$
FROM
CATENTRY
LEFT OUTER JOIN CATENTDESC ON 
(CATENTDESC.CATENTRY_ID = CATENTRY.CATENTRY_ID AND 
CATENTDESC.LANGUAGE_ID = ($CTX:LANG_ID$)) 
Instruction SQL après la substitution :
SELECT 
CATENTRY.CATENTRY_ID,
CATENTRY.PARTNUMBER,
CATENTDESC.CATENTRY_ID,
CATENTDESC.SHORTDESCRIPTION
FROM
CATENTRY
LEFT OUTER JOIN CATENTDESC ON 
(CATENTDESC.CATENTRY_ID = CATENTRY.CATENTRY_ID AND 
CATENTDESC.LANGUAGE_ID = (-1)) 
Ci-dessous figure une liste des mappages entre les clés et les propriétés de contexte pour le module de service Catalogue (provenant du fichier wc-component.xml) :
<_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"/>
Ci-dessous figure une liste des mappages entre les clés et les propriétés de contexte pour le module de service Marketing (provenant du fichier wc-component.xml) :
<_config:context key="STORE_ID" name="com.ibm.commerce.context.base.BaseContext" propertyName="storeId" defaultValue="0"/>
<_config:context key="LANG_ID" name="com.ibm.commerce.context.globalization.GlobalizationContext" propertyName="languageId" defaultValue="-1"/> 
Remarque :
  1. Le module de service Marketing ne peut pas utiliser les balises CATALOG_ID et OWNER_ID dans ses requêtes. Les balises LANG_ID et STORE_ID sont partagées par les deux composants.
  2. Chaque propriété doit comporter une valeur par défaut. Cette valeur est utilisée dans la requête si la propriété de contexte n'a pas été définie.

$ATTR_TBLS$ et $ATTR_CNDS$ - Balises de recherche paramétrique

Les balises $ATTR_TBLS$et $ATTR_CNDS$ sont utilisées pour les recherches paramétriques. Elles marquent l'emplacement où une liste de tables d'attribut ($ATTR_TBLS$) et de conditions de recherche d'attribut ($ATTR_CNDS$) doit être insérée dans un modèle SQL.

La liste des tables d'attribut est composée des tables où les attributs de recherche en entrée sont définis. Les conditions de recherche d'attribut incluent les conditions de jonction entre les tables d'attribut et la table de base, ainsi que les prédicats où les valeurs des colonnes d'attribut sont mises en correspondance avec les valeurs d'attribut de recherche en entrée.

Remarque : La balise $ATTR_TBLS$ doit être spécifiée après les dernières tables dans la clause FROM. La balise $ATTR_CNDS$ doit être spécifiée après la dernière condition de recherche de la clause WHERE.

Dans l'exemple ci-après, une expression de recherche paramétrique XPath recherche des produits dont la description abrégée contient la chaîne 'Polo shirt" et les numéros de référence commencent par le préfixe 'FU01'.

/CatalogEntry[search(contains(Description/ShortDescription, "Polo shirt") and starts-with(CatalogEntryIdentifier/ExternalIdentifier/PartNumber, "FU01"))]

Le modèle XPath to SQL avec une fonction search() est similaire à ceci avant la génération du code de recherche :

BEGIN_XPATH_TO_SQL_STATEMENT
name=/CatalogEntry[search()]
base_table=CATENTRY
sql=
SELECT 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

Dans l'instruction SQL générée ci-dessous, la variable $ATTR_TBLS$ est remplacée par la table associée contenant la colonne correspondant à la propriété ‘Description/ShortDescription'. La variable $ATTR_CNDS$ est remplacée par la condition de jonction entre cette table et la table de base, et la condition à laquelle comparer la colonne ‘SHORTDESCRIPTION' par la valeur de description abrégée fournie en entrée. La condition pour la propriété ‘CatalogEntryIdentifier/ExternalIdentifier' correspondant à la colonne PARTNUMBER dans la table de base CATENTRY est également incluse.

SELECT 
	CATENTRY.CATENTRY_ID
FROM
	CATENTRY, CATENTDESC IBM1
WHERE 
	CATENTRY.MARKFORDELETE = 0 AND CATENTRY.PARTNUMBER LIKE 'FU01%'
	AND (CATENTRY.CATENTRY_ID= IBM1.CATENTRY_ID AND 
	IBM1.SHORTDESCRIPTION LIKE '%Polo shirt%')
ORDER BY
	CATENTRY.CATENTRY_ID 

La balise $ATTR_CNDS$ est remplacée par une condition de jonction et des conditions de recherche. Le nom de la table de base (ou son nom de corrélation) concaténé avec le séparateur '.' peut figurer en préfixe de la balise $ATTR_CNDS$. Ce préfixe définit le nom de corrélation à utiliser pour se référer à la colonne de clé primaire de la table de base dans la condition de jonction. La seconde condition correspond à la condition de recherche spécifiée dans la requête XPath en entrée.

$ENTITY_PKS$

La balise $ENTITY_PKS$ est utilisée avec les requêtes à deux étapes dans les instructions SQL associées. Elle marque l'emplacement où insérer les valeurs de clé primaire renvoyées par l'instruction XPath to SQL.

L'instruction SQL d'association et les instructions XPath to SQL opèrent ensemble pour obtenir les données de la table de base et des tables associées. L'instruction SQL XPath sélectionne les clés primaires depuis la table de base. L'instruction SQL associée sélectionne des données depuis les tables associées à la table de base via des relations de clé externe.

Le comportement par défaut consiste à rechercher les valeurs de clé primaire et à les injecter dans l'instruction SQL d'association en remplacement de la balise $ENTITY_PKS$. Cependant, vous pouvez configurer la génération de la requête afin de composer une requête unique en injectant l'instruction XPath to SQL dans l'instruction SQL d'association en tant qu'instruction de sous-requête (subselect).

Cette configuration est contrôlée par l'indicateur 'usePrimaryKeyValues' qui est spécifié dans la section 'entity' de la définition du profil d'accès. Si cet indicateur est défini à 'true', les valeurs de clé primaire extraites par l'instruction XPath to SQL sont injectées dans les instructions SQL d'association SQL en remplacement de la balise $ENTITY_PKS$. Ceci est effectué pour toutes les instructions SQL d'association référencées par ce profil. Il s'agit du comportement par défaut. Si l'indicateur est défini à 'false', l'instruction subselect de clé primaire est injectée dans les instructions SQL d'association référencées par ce profil.

Remarque : Si la pagination est utilisée, la valeur de 'usePrimaryKeyValues' est supposée être toujours définie à 'true'.

Le modèle XPath to SQL qui extrait les clés primaires de tous les enregistrements CATENTRY en fonction de leur ID de groupe de catalogue parent est défini comme illustré dans l'exemple suivant :

SELECT CATENTRY.$COLS:CATENTRY_ID$
FROM CATENTRY INNER JOIN CECGREL ON CATENTRY.CATENTRY_ID = CECGREL.CATENTRY_ID
WHERE CATENTRY.MARKFORDELETE = 0 
	AND CECGREL.CATGROUP_ID = ?catGroupId? 
	AND CECGREL.USAGECODE = ?relationshipType?

L'instruction SQL associée extrait les descriptions des enregistrements CATENTRY concernés :

SELECT CATENTRY.$COLS:CATENTRY$, CEDESC.$COLS:CEDESC$
FROM CATENTRY, CEDESC
WHERE CATENTRY.CATENTRY_ID = CEDESC.CATENTRY_ID 
	AND CATENTRY.MARKFORDELETE = 0
	AND CEDESC.LANGUAGE_ID = $CTX:LANG_ID$ 
	AND CATENTRY.CATENTRY_ID IN ( $ENTITY_PKS$ )

Après injection de l'instruction subselect de clé primaire (instruction XPath to SQL) dans l'instruction SQL associée, la requête résultante est la suivante :

SELECT CATENTRY.$COLS:CATENTRY$, CEDESC.$COLS:CEDESC$
FROM CATENTRY, CEDESC
WHERE CATENTRY.CATENTRY_ID = CEDESC.CATENTRY_ID 
	AND CATENTRY.MARKFORDELETE = 0 
	AND CEDESC.LANGUAGE_ID = $CTX:LANG_ID$
	AND CATENTRY.CATENTRY_ID IN 
		(SELECT CATENTRY.CATENTRY_ID 
			FROM CATENTRY INNER JOIN CECGREL ON CATENTRY.CATENTRY_ID = CECGREL.CATENTRY_ID
			WHERE CATENTRY.MARKFORDELETE = 0 
				AND CECGREL.CATGROUP_ID = ?catGroupId?
				AND CECGREL.USAGECODE = ?relationshipType?)

Si l'indicateur reflète l'utilisation d'une instruction de sous-requête, l'instruction subselect de clé primaire est injectée dans l'instruction SQL associée. Sinon, la balise $ENTITY_PKS$ est remplacée par les valeurs de clé primaire. Le nom de l'indicateur booléen est 'usePrimaryKeyValues'.

Si cet indicateur est défini sur 'true', les valeurs de clé primaire extraites par l'instruction XPath to SQL sont injectées dans les instructions SQL d'association en remplacement de la balise $ENTITY_PKS$. Ceci est effectué pour toutes les instructions SQL d'association référencées par ce profil. Il s'agit de la valeur par défaut.

Si cet indicateur est défini à 'false', l'instruction XPath to SQL est injectée sous forme d'instruction subselect dans les instructions SQL d'association en remplacement de la balise $ENTITY_PKS$.

Par exemple :
BEGIN_PROFILE
name=IBM_DefaultProfile

BEGIN_ENTITY 
base_table=CATENTRY 
usePrimaryKeyValues = false
associated_sql_statement=IBM_CatEntrySummary 
END_ENTITY

END_PROFILE 

$CONTROL:LANGUAGES$

Cette balise est utilisée pour rechercher des informations dépendantes de la langue dans diverses langues. La liste de ces langues provient du paramètre de contrôle _wcs.dataLanguageIds de la requête. La valeur de ce paramètre est une liste séparée par des virgules des identificateurs de langue qui sont injectés dans le modèle de requête en remplacement de la balise $CONTROL:LANGUAGES$. Si le paramètre _wcs.dataLanguageIds n'et pas transmis dans la requête, la valeur de l'ID de langue est obtenue à partir du contexte de globalisation.

Vous pourriez l'utiliser par exemple dans une expression XPath comme illustré ci-dessous :
{_wcf.ap=IBM_CEDescriptionProfile_LANGIDS;_wcf.dataLanguageIds='-1,-2'}/CatEntry[@catEntryId<200]
Vous pouvez également utiliser la balise de langues comme illustré dans l'exemple de bloc ASSOCIATED_SQL_STATEMENT ci-dessous :
BEGIN_ASSOCIATION_SQL_STATEMENT
       name= IBM_CEDescriptionProfile_LANGIDS
       base_table=CATENTRY
       sql=
              SELECT 
                            CATENTRY.$COLS:CATENTRY$,
                            CEDESC.$COLS:CEDESC$ 
              FROM
                            CATENTRY, CEDESC
              WHERE                            
                            CATENTRY.CATENTRY_ID = CEDESC.CATENTRY_ID AND
                            CEDESC.LANGUAGE_ID in ($CONTROL:LANGUAGES$)        AND
                            CATENTRY.CATENTRY_ID in ( $ENTITY_PKS$ )                            

END_ASSOCIATION_SQL_STATEMENT

$STOREPATH:STRELTYPE$

WebSphere Commerce prend en charge plusieurs types de relations entre magasins d'un site. Un magasin peut utiliser, par exemple, le catalogue fourni par un autre magasin.

La couche service de données aide à extraire de la base de données les informations de relation de magasin en vous permettant d'utiliser une balise spéciale, $STOREPATH:STRELTYPE$, dans le modèle SQL. Cette balise est remplacée en phase d'exécution par la valeur du type de relation entre magasins (par exemple, catalogue ou campagnes) correspondant au STRELTYPE. Un mappage entre le STRELTYPE et le nom du type de relation de magasin peut éventuellement être défini dans le fichier de configuration du composant.Si ce mappage n'est pas défini, la valeur par défaut de la chaîne de relation de magasin sera préfixée avec la chaîne "com.ibm.commerce".

Par exemple, si le STRELTYPE est catalog, la valeur par défaut du type de relation sera "com.ibm.commerce.catalog".Cette valeur correspond à la valeur de la colonne name dans la table streltyp de la relation de magasin du catalogue.

Par conséquent, si vous ajoutez un nouveau type de relation entre magasins, vous devez définir STRELTYPE dans le fichier wc-component.xml afin de garantir un mappage correct entre STRELTYPE et le nom du type de relation entre magasins :

<_config:store-relationship key="xxxxx" value="com.mycompany.commerce.xxxxx"/>

$CM:BASE$, $CM:WRITE$, $CM:READ$

Les variables de substitution $CM:BASE$, $CM:WRITE$ et $CM:READ$ sont utilisées par le modèle de requête afin de représenter les noms des schémas BASE, WRITE et READ. Ces variables sont remplacées par des noms de schéma réels au moment de l'exécution de la requête.

Dans l'environnement d'espaces de travail, vous devrez peut-être définir les requêtes qui font explicitement référence aux schémas BASE, WRITE et READ. Pour plus d'informations, voir Modèle d'espace de données et Techniques d'amélioration des performances des requêtes SQL sur les espaces de travail de la couche service de données.