[google-appengine] Re: questions on datastore (lowercase comparison / one character String )

2010-03-23 Thread vchalmel
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 )

2010-03-23 Thread Chau
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 )

2010-03-22 Thread Gleidson - MG - Brasil
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 )

2010-03-22 Thread Chau
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.