12
votes

Cas insensible à la clause dans la requête GQL pour StringProperty

Utilisation de Google Appengine Datastore, existe-t-il un moyen d'effectuer une requête GQL qui spécifie une clause où sur un type de type de données StringProperty est insensible à la casse? Je ne suis pas toujours sûr du cas de la valeur. Les DOC spécifient que le cas échéant est sensible à mes valeurs, existe-t-il un moyen de rendre cette insensible?

Par exemple, le modèle de DB serait ceci: xxx

et les données ressemblent à ceci: xxx

je voudrais dire xxx

et avoir retourvalue contient xxx


0 commentaires

3 Réponses :


14
votes

Je ne pense pas qu'il y ait un opérateur comme celui dans le magasin de données.

Contrôlez-vous l'entrée des données de catégorie? Si tel est le cas, vous devez choisir une forme canonique pour le stocker (toutes minuscules ou toutes majuscules). Si vous avez besoin de stocker le cas d'origine pour une raison quelconque, vous pouvez simplement stocker deux colonnes - une avec l'original, une avec la normalisée. De cette façon, vous pouvez faire une clause normale où.


0 commentaires

6
votes

Le magasin de données ne prend pas en charge les comparaisons insensibles de cas, car vous ne pouvez pas indexer les requêtes qui les utilisent (n'entrant qu'un index qui transforme les valeurs). La solution consiste à stocker une version normalisée de votre chaîne en plus de la norme, comme le suggère Peter. Les classes de la propriété dans le La bibliothèque de FeetCoon peut s'avérer utile, en particulier, dérivéeProperty.


1 commentaires

J'ai fini par écrire un script pour les normaliser. Merci pour le pointeur de la bibliothèque.



0
votes

Ce fil m'a été utile et me donne envie de contribuer avec une approche similaire pour faire une recherche partielle possible. J'ajoute un champ de plus sur le type de datastore et enregistrez chaque mot sur la phrase normalisée en tant que jeu, puis utilisez-le dans le filtre pour entrer en collision. C'est un exemple avec une clojure. Normaliser la partie devrait être facile à traduire vers Java au moins (grâce à @Arek sur #Clojure), tandis que l'interaction de la base de données doit être convertiable vers n'importe quelle langue:

(use '[clojure.contrib.string :only [split lower-case]])
(use '[appengine-magic.services.datastore :as ds])

; initialize datastore kind entity
(ds/defentity AnswerTextfield [value, nvalue, avalue]) 

; normalize and lowercase a string
(defn normalize [string-to-normalize]
  (lower-case
    (apply str
      (remove #(= (Character/getType %) Character/NON_SPACING_MARK)
               (java.text.Normalizer/normalize string-to-normalize java.text.Normalizer$Form/NFKD)))))

; save original value, normalized value and splitted normalized value
(defn textfield-save! [value]
  (ds/save! 
    (let [nvalue (normalize value)]
      (ds/new* AnswerTextfield [value nvalue (split #" " nvalue)]))))

; normalized search
(defn search-normalized [value]
  (ds/query :kind AnswerTextfield
            :filter [(= :nvalue (normalize value))]))

; partial normalized word search
(defn search-partial [value]
  (flatten
    (let [coll []]
      (for [splitted-value (split #" " (normalize value))]
        (merge coll 
          (ds/query :kind AnswerTextfield
                    :filter [(in :avalue [splitted-value])]))))))


0 commentaires