[google-appengine] Re: questions on datastore (lowercase comparison / one character String )
Ok Thanks your advices solved my problem with lowercase Comparison. I still faces issues with these one-character Strings problem, do you know why, when i try to compare a String Attribute in Datastore to a one-character String, it throws this java.lang.Character cannot be cast to com.google.appengine.api.datastore.Key exception ? -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: questions on datastore (lowercase comparison / one character String )
It seems to be issue querying with Key param Please check another article from Max and see if it help: http://gae-java-persistence.blogspot.com/2010/01/querying-with-key-parameters.html On Mar 23, 1:47 pm, vchalmel groupeprojeten...@gmail.com wrote: Ok Thanks your advices solved my problem with lowercase Comparison. I still faces issues with these one-character Strings problem, do you know why, when i try to compare a String Attribute in Datastore to a one-character String, it throws this java.lang.Character cannot be cast to com.google.appengine.api.datastore.Key exception ? -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: questions on datastore (lowercase comparison / one character String )
If you're using a relational database it's pretty easy to execute case- insensitive queries because it's a native feature of the database. It usually looks something like this: select * from Person where UPPER(lastName) = 'ROSS' This is a challenge for the App Engine Datastore because we rely on executing scans over a limited subset of your data and returning results as we encounter them. Consider the following strings in lexicographic order: ... ROSE ... ROSS ... ROSTA ... Rose ... Ross ... Rosta ... rose ... ross ... rosta ... As you can see there could be an unlimited number of rows in between 'ROSS' and 'Ross', and also between 'Ross' and 'ross' (okay not unlimited, we do have a limit on indexed string length, but definitely Large), so if we start scanning at 'ROSS' we might have to skip a huge number of results before we hit 'Ross', and that doesn't scale. This is why the datastore doesn't support case-insensitive queries. Fortunately it's not hard to implement support for case-insensitive queries in your application. Here's the approach: for each field that you want to query in a case-insensitive way, create a duplicate field that stores the value of that field in either all upper or lowercase letters. Then, have your model object register a pre-persist callback with your persistence framework (JPA or JDO), and then populate the duplicate fields inside that callback. Here's what it looks like. JPA: import javax.persistence.PrePersist; import javax.persistence.PreUpdate; @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String lastName; private String uppercaseLastName; public Long getId() { return id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } @PrePersist @PreUpdate public void prePersist() { if (lastName != null) { uppercaseLastName = lastName.toUpperCase(); } else { uppercaseLastName = null; } } } public ListPerson getPeopleByLastName(String lastName) { Query q = em.createQuery(select from Person where uppercaseLastName = :p); q.setParameter(p, lastName.toUpperCase()); return (ListPerson) q.getResultList(); } JDO: import javax.jdo.listener.StoreCallback; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Person implements StoreCallback { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; private String lastName; private String uppercaseLastName; public Long getId() { return id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public void jdoPreStore() { if (lastName != null) { uppercaseLastName = lastName.toUpperCase(); } else { uppercaseLastName = null; } } } public ListPerson getPeopleByLastName(String lastName) { Query q = pm.newQuery(Person.class, uppercaseLastName == :p); return (ListPerson) q.execute(lastName.toUpperCase()); } On 21 mar, 17:41, vchalmel groupeprojeten...@gmail.com wrote: Hi ! I wonder how to compare a String stored in a datastore entity (field login) to an entry (also named login) considering their lowercase version : - I tried : SELECT count(this) FROM +Gestionnaire.class.getName()+ WHERE LowerCase(login)== LowerCase('+login+') which throws an exception I have another problem with this query, I don't want to exclude the one-character login like, maybe 1, but this also fires an exception ( java.lang.Character cannot be cast to com.google.appengine.api.datastore.Key ) -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: questions on datastore (lowercase comparison / one character String )
You can save storage by just quote Max Ross's article... http://gae-java-persistence.blogspot.com/2009/11/case-insensitive-queries.html On Mar 23, 12:27 am, Gleidson - MG - Brasil gleidson.gmo...@gmail.com wrote: If you're using a relational database it's pretty easy to execute case- insensitive queries because it's a native feature of the database. It usually looks something like this: select * from Person where UPPER(lastName) = 'ROSS' This is a challenge for the App Engine Datastore because we rely on executing scans over a limited subset of your data and returning results as we encounter them. Consider the following strings in lexicographic order: ... ROSE ... ROSS ... ROSTA ... Rose ... Ross ... Rosta ... rose ... ross ... rosta ... As you can see there could be an unlimited number of rows in between 'ROSS' and 'Ross', and also between 'Ross' and 'ross' (okay not unlimited, we do have a limit on indexed string length, but definitely Large), so if we start scanning at 'ROSS' we might have to skip a huge number of results before we hit 'Ross', and that doesn't scale. This is why the datastore doesn't support case-insensitive queries. Fortunately it's not hard to implement support for case-insensitive queries in your application. Here's the approach: for each field that you want to query in a case-insensitive way, create a duplicate field that stores the value of that field in either all upper or lowercase letters. Then, have your model object register a pre-persist callback with your persistence framework (JPA or JDO), and then populate the duplicate fields inside that callback. Here's what it looks like. JPA: import javax.persistence.PrePersist; import javax.persistence.PreUpdate; @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String lastName; private String uppercaseLastName; public Long getId() { return id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } @PrePersist @PreUpdate public void prePersist() { if (lastName != null) { uppercaseLastName = lastName.toUpperCase(); } else { uppercaseLastName = null; } } } public ListPerson getPeopleByLastName(String lastName) { Query q = em.createQuery(select from Person where uppercaseLastName = :p); q.setParameter(p, lastName.toUpperCase()); return (ListPerson) q.getResultList(); } JDO: import javax.jdo.listener.StoreCallback; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Person implements StoreCallback { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; private String lastName; private String uppercaseLastName; public Long getId() { return id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public void jdoPreStore() { if (lastName != null) { uppercaseLastName = lastName.toUpperCase(); } else { uppercaseLastName = null; } } } public ListPerson getPeopleByLastName(String lastName) { Query q = pm.newQuery(Person.class, uppercaseLastName == :p); return (ListPerson) q.execute(lastName.toUpperCase()); } On 21 mar, 17:41, vchalmel groupeprojeten...@gmail.com wrote: Hi ! I wonder how to compare a String stored in a datastore entity (field login) to an entry (also named login) considering their lowercase version : - I tried : SELECT count(this) FROM +Gestionnaire.class.getName()+ WHERE LowerCase(login)== LowerCase('+login+') which throws an exception I have another problem with this query, I don't want to exclude the one-character login like, maybe 1, but this also fires an exception ( java.lang.Character cannot be cast to com.google.appengine.api.datastore.Key ) -- You received this message because you are subscribed to the Google Groups Google App Engine group. To post to this group, send email to google-appeng...@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.