> > I have the following code:
>
> > class EventQuery(Query):
> >   def histogram(self):
> >     ''' return a histogram of source / count(source) given an eventquery''
> >     ...
> > ...
>
> > class Event(Base):
> >   __tablename__ = 'events'
> >   query = Session.query_property(query_cls = EventQuery)
> >   name = Column(Unicode(128))
> >   source = Column(BigInteger)
> > ...
>
> > Now, Event has 54 additional attributes, some of which are quite large. In 
> > EventQuery.histogram(), all I really need is the Event.source attribute. 
> > 'events' has over 150 million rows, and it's likely that 
> > EventQuery.histogram() will be called for all events.
>
> > So - is there any way to 'modify' the query (self) in histogram() so that 
> > it only returns (Event.source, func.count(Event.source)), or, for the 
> > general case, to modify the query to return an attribute of the object? 
> > I've tried from_self, but that seems highly inefficient (at least 20x 
> > slower than Session.query(...) ). I'd also really like to keep histogram() 
> > as a method of EventQuery.
>
> > I can see reasons why this would be impossible, but perhaps there's a way 
> > to do it.
>
> you can use values(Event.source, func.count(...)), or just put a method on 
> Event called "histogram" that uses the standard 
> object_session(self).query(...) approach, I'm not really sure what the using 
> the old "query_property" accessor gets you here
>

Thanks, Michael. Two followup questions:

1) The histogram() method is designed to provide statistics on a set
of Events (defined by a query), so it made sense (to me) to make it a
method of EventQuery. I don't know how I'd do this as a method of
Event. Could you clarify?

2) When you say 'old "query property"' accessor, are you implying that
query_property is deprecated? Is there an alternative? I really like
the idea of subclassing Query and adding custom methods. Is this a
misguided approach?

BTW: the values() generator takes at least as long as the from_self()
does, and uses a huge amount of memory since all().values() still
passes the entire object list to python. from_self() took 1920 seconds
to run against the entire 'events' table, where
Session.query(func.distinct(Event.source)).all() took 0.02 seconds.
I'll try experimenting with joins next.

Thanks,

S.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
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/sqlalchemy?hl=en.

Reply via email to