4D v18dataClass.query( ) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v18
dataClass.query( )
|
Comparaison | Symbole(s) | Commentaire |
Egal à | =, == | Retourne les données correspondantes, prend en charge le joker de recherche (@), ne tient pas compte de la casse et est non diacritique. |
===, IS | Retourne les données correspondantes, considère le @ comme un caractère standard, ne tient pas compte de la casse et est non diacritique. | |
Différent de | #, != | Prend en charge le joker de recherche (@) |
!==, IS NOT | Considère le @ comme un caractère standard | |
Inférieur à | < | |
Supérieur à | > | |
Inférieur ou égal à | <= | |
Supérieur ou égal à | >= | |
Inclus parmi | IN | Retourne les données égales à au moins une des valeurs d'une collection ou d'un ensemble de valeurs, prend en charge le joker de recherche (@) |
Condition Not appliquée à une assertion | NOT | Les parenthèse sont obligatoires lorsque NOT est utilisé devant une assertion contenant plusieurs opérateurs |
Contient mot-clé | % | Les mots-clés peuvent être définis dans les attributs de type texte ou image |
Conjonction | Symbole(s) |
AND | &, &&, and |
OR | |, ||, or |
Utilisation des guillemets/apostrophes
Lorsque vous utilisez des guillemets dans les recherches, vous devez utiliser des apostrophes ' ' à l'intérieur des requêtes et des guillemets " " pour encadrer la recherche complète, sinon une erreur est générée. Par exemple :
"personne.nom = 'smith' AND personne.prenom = 'john'"
Note : Les guillemets simples ne sont pas pris en charge dans les valeurs recherchées car ils casseraient la chaîne de recherche.
Par exemple, "comp.name = 'John's pizza' " génèrera une erreur. Si vous devez rechercher des valeurs contenant des guillemets simples, il est nécessaire d'utiliser des placeholders (voir ci-dessous).
Utilisation des parenthèses
Vous pouvez utiliser des parenthèses dans la recherche afin de prioriser les calculs. Par exemple, vous pouvez organiser une recherche de la manière suivante :
"(personne.age >= 30 OR personne.age <= 65) AND (personne.salaire <= 10000 OR personne.statut = 'Manager')"
Au lieu d'insérer une formule dans le paramètre chaîneRecherche (voir ci-dessus), vous pouvez directement passer un objet formule en tant que critère de recherche booléen. L'utilisation d'un objet formule pour les requêtes est recommandée car vous bénéficiez d'une tokénisation et car il est plus facile de rechercher/lire du code.
La formule doit avoir été créée à l'aide de la commande Formula ou Formula from string. Dans ce cas :
Note : Pour des raisons de sécurité, les appels de formule dans les méthodes membres query() peuvent être interdits. Voir la description du paramètre params.
Passer des paramètres à des formules
Toute formule appelée par la méthode membre query() peut recevoir des paramètres :
Ce code montre comment les paramètres sont passés aux méthodes :
$settings:=New object("args";New object("exclude";"-")) //objet args pour passer des paramètres
$es:=ds.Students.query("eval(checkName($1.exclude))";$settings) //args est reçu dans $1
Des exemples supplémentaires sont fournis dans l'exemple 3.
4D Server : En mode client/serveur, les formules sont exécutées sur le serveur. Dans ce contexte, seul l'objet querySettings.args est envoyé aux formules.
4D vous permet d'utiliser des placeholders pour les arguments cheminAttribut et valeur du paramètre params. Un placeholder est un paramètre que vous insérez dans des chaines de recherche et qui est remplacé par une autre valeur au moment où la chaîne de recherche est évaluée. La valeur des placeholders est évaluée une seule fois, au début de la requête; elle n'est pas évaluée pour chaque élément.
Il existe deux types de placeholders : les placeholders indexés et les placeholders nommés.
- | Placeholders indexés | Placeholders nommés |
Définition | Les paramètres sont insérés comme : paramIndex (par exemple :1, :2...) dans chaîneRecherche et leurs valeurs sont fournies par la séquence du/des paramètre(s) valeur. Vous pouvez utiliser jusqu'à 128 paramètres valeur | Les paramètres sont insérés comme : paramName (par exemple :myparam) et leurs valeurs sont fournies dans les objets attributes et/ou parameters dans le paramètre params. |
Exemple | $r:=class.query(":1=:2";"city";"Chicago") | $o.attributes:=New object("att";"city") |
Vous pouvez combiner tous les types d'arguments dans chaîneRecherche. Une chaîneRecherche peut contenir, en termes de paramètres cheminAttribut et valeur :
Utiliser des placeholders dans les recherches est recommandé pour deux raisons :
$vquery:="statut = 'public' & nom = "+myname //l'utilisateur saisit son nom
$result:=$col.query($vquery)
$result:=$col.query("statut='public' & nom=:1";myname)
$result:=$col.query("address.city = :1 & name =:2";$city;$myVar+"@")
$result2:=$col.query("company.name = :1";"John's Pizzas")
Recherche de valeurs null
Lorsque vous recherchez les valeurs null, vous ne pouvez pas utiliser la syntaxe placeholder car le moteur de recherche considère la valeur null comme une valeur de comparaison invalide. Par exemple, si vous exécutez la recherche suivante :
$vSingles:=ds.Person.query("spouse = :1";Null) // n'aboutira pas
$vSingles:=ds.Person.query("spouse = null") //syntaxe valide
Dans le paramètre params, vous pouvez passer un objet contenant des options supplémentaires. Vous pouvez utiliser les propriétés suivantes :
Property | Type | Description | ||||||
parameters | Objet | Placeholders nommés pour les valeurs utilisées dans in the chaîneRecherche. Les valeurs sont exprimées sous forme de paires propriété / valeur, où propriété est le nom du placeholder inséré pour une valeur, dans la chaîneRecherche (":placeholder") et où valeur correspond à la valeur à comparer. Vous pouvez combiner, dans la même recherche, les valeurs des placeholders indexés (valeurs passées directement dans les paramètres valeur) et les valeurs des placeholders nommés. | ||||||
attributes | Objet | Placeholders nommés pour les chemins d'attribut utilisés dans used in the chaîneRecherche. Les attributs sont exprimés sous forme de paires propriété / valeur, où propriété est le nom du placeholder inséré pour un chemin d'attribut dans la chaîneRecherche (":placeholder") et où valeur peut être une chaine ou une collection de chaines. Chaque valeur correspond à un chemin qui peut être désigné soit par un attribut scalaire ou relatif de la dataclass soit par une propriété d'un champ objet de la dataclass
| ||||||
context | Texte | Nom du contexte d'optimisation automatique appliqué à la sélection d'entités. Ce contexte sera utilisé par le code qui gère la sélection d'entités afin de bénéficier de l'optimisation. Cette fonctionnalité est conçue pour le traitement client/serveur ; pour plus d'informations, veuillez vous reporter à la section Optimisation client/serveur . | ||||||
queryPlan | Booléen | Dans la sélection d'entités résultante, retourne ou ne retourne la description détaillée de la recherche juste avant d'être exécutée, i.e. la recherche programmée. La propriété retournée est un objet qui inclut chaque recherche et sous-recherche programmée (dans le cas d'une recherche complexe). Cette option est utile durant la phase de développement d'une application. Elle est utilisée conjointement à queryPath. Par défaut, si elle est omise : faux. Note : Cette propriété est prise en charge uniquement par les méthodes entitySelection.query( ) et dataClass.query( ). | ||||||
queryPath | Booléen | Dans la sélection d'entités résultante, retourne ou ne retourne pas la description détaillée de la recherche telle qu'elle est effectuée. La propriété retournée est un objet qui contient le chemin utilisé pour la recherche (généralement identique à celui de queryPlan, mais il peut être différent si le moteur parvient à optimiser la recherche), l'heure du traitement et le nombre d'enregistrements trouvés. Cette option est utile durant la phase de développement d'une application. Par défaut, si elle est omise : faux. Note : Cette propriété est prise en charge uniquement par les méthodes entitySelection.query( ) et dataClass.query( ). |
A propos du queryPlan et du queryPath
Les informations enregistrées dans le queryPlan et le queryPath incluent le type de recherche (indexée ou séquentielle), chaque sous-recherche nécessaire, ainsi que les opérateurs de conjonction. Le queryPath contient également le nombre d'entités trouvées et le temps nécessaire à l'exécution de chaque critère de recherche. Il vous sera utile d'analyser ces informations lors du développement de vos applications. Généralement, les descriptions du plan et du chemin de recherche sont identiques mais elles peuvent différer car 4D peut mettre en oeuvre des optimisations dynamiques lors de l'exécution de la recherche, afin d'améliorer les performances. Par exemple, le moteur de recherche de 4D peut convertir dynamiquement une recherche indexée en recherche séquentielle s'il estime qu'elle s'exécutera plus rapidement. Ce cas particulier peut se produire lorsque le nombre d'entités parmi lesquelles la recherche est effectuée est limité.
Par exemple, si vous exécutez la recherche suivante :
$sel:=ds.Employee.query("salary < :1 and employer.name = :2 or employer.revenues > :3";50000;"Lima West Kilo";10000000;New object("queryPath";True;"queryPlan";True))
queryPlan:
{Or:[{And:[{item:[index : Employee.salary ] < 50000},{item:Join on Table : Company : Employee.employerID = Company.ID,subquery:[{item:[index : Company.name ] = Lima West Kilo}]}]},{item:Join on Table : Company : Employee.employerID = Company.ID,subquery:[{item:[index : Company.revenues ] > 10000000}]}]}
queryPath:
{steps:[{description:OR,time:63,recordsfounds:1388132,steps:[{description:AND,time:32,recordsfounds:131,steps:[{description:[index : Employee.salary ] < 50000,time:16,recordsfounds:728260},{description:Join on Table : Company : Employee.employerID = Company.ID,time:0,recordsfounds:131,steps:[{steps:[{description:[index : Company.name ] = Lima West Kilo,time:0,recordsfounds:1}]}]}]},{description:Join on Table : Company : Employee.employerID = Company.ID,time:31,recordsfounds:1388132,steps:[{steps:[{description:[index : Company.revenues ] > 10000000,time:0,recordsfounds:933}]}]}]}]}
Cette section fournit divers exemples de recherches.
Recherche dans une chaîne :
$entitySelection:=ds.Customer.query("firstName = 'S@'")
Recherche avec une instruction NOT :
$entitySelection:=ds.Employee.query("not(firstName=Kim)")
Recherche avec des dates :
$entitySelection:=ds.Employee.query("birthDate > :1";"1970-01-01")
$entitySelection:=ds.Employee.query("birthDate <= :1";Current date-10950)
Recherche avec des placeholders indexés pour les valeurs :
$entitySelection:=ds.Customer.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@")
Recherche avec des placeholders indexés pour les valeurs sur une dataClass liée :
$entitySelection:=ds.Employee.query("lastName = :1 and manager.lastName = :2";"M@";"S@")
Recherche avec des placeholders nommés pour les valeurs :
C_OBJECT($querySettings;$managedCustomers)
$querySettings:=New object
$querySettings.parameters:=New object("userId";1234;"extraInfo";New object("name";"Smith"))
$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name = :extraInfo.name";$querySettings)
Recherche utilisant les placeholders nommés et indexés pour les valeurs :
C_OBJECT($querySettings;$managedCustomers)
$querySettings:=New object
$querySettings.parameters:=New object("userId";1234)
$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name=:1";"Smith";$querySettings)
Recherche avec objets queryPlan et queryPath :
$entitySelection:=ds.Employee.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@";New object("queryPlan";True;"queryPath";True))</p><p> //vous pouvez ensuite récupérer ces propriétés dans la sélection d'entités résultante :
C_OBJECT($queryPlan;$queryPath)
$queryPlan:=$entitySelection.queryPlan
$queryPath:=$entitySelection.queryPath
Recherche avec un chemin d'attribut de type Collection :
$entitySelection:=ds.Employee.query("additionalInfo.hobbies[].name = :l";"horsebackriding")
Recherche avec un chemin d'attribut de type Objet :
$entitySelection:=ds.Employee.query("extra.eyeColor = :1";"blue")
Recherche avec instruction IN :
$entitySelection:=ds.Employee.query("firstName in :1";New collection("Kim";"Dixie"))
Recherche avec instruction NOT (IN) :
$entitySelection:=ds.Employee.query("not (firstName in :1)";New collection("John";"Jane"))
Recherche avec des placeholders indexés pour les attributs :
C_OBJECT($es)
$es:=ds.Employee.query(":1 = 1234 and :2 = 'Smith'";"salesperson.userId";"name")
//salesperson est une entité liée
Recherche avec des placeholders indexés pour les attributs et avec des placeholders nommés pour les valeurs :
C_OBJECT($es;$querySettings)
$querySettings:=New object
$querySettings.parameters:=New object("customerName";"Smith")
$es:=ds.Customer.query(":1 = 1234 and :2 = :customerName";"salesperson.userId";"name";$querySettings)
//salesperson est une entité liée
Recherche avec des placeholders indexés pour les attributs et les valeurs :
C_OBJECT($es)
$es:=ds.Clients.query(":1 = 1234 and :2 = :3";"salesperson.userId";"name";"Smith")
//salesperson est une entité liée
Cette section illustre les recherches avec des placeholders nommés pour les attributs.
Considérons une dataclass Employee avec 2 entités :
Recherche avec des placeholders nommés pour les attributs :
C_OBJECT($querySettings;$es)
$querySettings:=New object
$querySettings.attributes:=New object("attName";"name";"attWord";New collection("softwares";"Word 10.2"))
$es:=ds.Employee.query(":attName = 'Marie' and :attWord = 'Installed'";$querySettings)
//$es.length=1 (Employee Marie)
Recherche avec des placeholders nommés pour les attributs et les valeurs :
C_OBJECT($es;$queySettings)
C_TEXT($name)
$querySettings:=New object
//Placeholders nommés pour les valeurs
//Il est demandé à l'utilisateur de saisir un nom
$name:=QUERY("Veuillez saisir le nom à rechercher:")
If(OK=1)
$querySettings.parameters:=New object("givenName";$name)
//Placeholders nommés pour les chemins d'attributs
$querySettings.attributes:=New object("attName";"name")
$es:=ds.Employee.query(":attName= :givenName";$querySettings)
End if
collection.query( )
dataClass.all( )
dataClass.newSelection( )
DESCRIBE QUERY EXECUTION
entitySelection.query( )
entitySelection.queryPath
entitySelection.queryPlan
GET QUERY DESTINATION
QUERY
SET QUERY DESTINATION
Produit : 4D
Thème : ORDA - DataClass
4D - Langage ( 4D v18)