Rather than query on a cost range, is it possible to create "range buckets"?

E.g, you could have buckets defined like this:

  1: < 100
  2: 100 - 199.99
  3: 200 - 299.99
  4: 300 - 399.99
  5: >= 400

Then, in your model, you'd have a ComputedProperty:

  def MyModel(ndb.Model):
    cost = ndb.FloatProperty(required=True)
    score = ndb.IntergerProperty(required=True)
    ...
*    cost_bucket = ndb.ComputedProperty(repeated=True, name='cb', lambda 
entity: MyModel.compute_cost_bucket(**entity**), indexed=True)*

    @classmethod
    def compute_cost_bucket(cls, entity):
      if entity.cost < 100:
        return ['1']
      if entity.cost < 200:
        return ['2']
     ...

Then you can query by an equality filter on your cost_bucket, but order by 
score:

  query = MyModel.query().filter(MyModel.cost_bucket == 
'1').order(MyModel.score)

You can have more cost buckets yielding a longer list of values, possibly 
even overlapping buckets, but the key thing is that you're only ever 
querying on one equality filter. So, for example, you could create a bucket 
called '1-2' that was for <200.

Caveat: deserializing a long list from a protocol buffer can be slow; 
projection queries can help if it becomes a problem. Also, writing a long 
list of indexed values costs $$.

Finally, the name 'cb' above is just a small storage optimization because 
the name is repeated in the protocol buffer for each value.

j

On Monday, 5 November 2012 08:33:16 UTC-6, Guillaume wrote:
>
> Hi all,
>
> I want to query all entities with a property (called "cost") within a 
> given range, and order the results according to another property (called 
> "score"). Both are integers.
> According to the doc, I cannot do that because I should order by the 
> "cost" first...
>
> Then I thought I could use a ListProperty of 2 elements : [cost, score].
> Provided that the range of possible values do not intersect, I could 
> filter and order the way I want.
>
> Is it a valid approach ?
>
> Thanks
>

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-appengine/-/jHuI9iRSapkJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.

Reply via email to