The problem stems from a tree structure and creating self joins
on a very large base table.. I am trying to create datasets
of items and filter on the contents of datasets in  single query
that it built up progressively.


base = Table ('base',
          Column('id', Integer, primarykey=True)
          Column('owner', String(255))
          ...
       )

dataset = Table('dataset',
              Column('id', Integer, ForiegnKey('base.id'),
primarykey=True)
              Column('parent_id', Integer, ForiegnKey('base.id'))
              Column('something_id',  Integer, ForiegnKey('base.id'))
          )

tags = Table('tags',
              Column('id', Integer, ForiegnKey('base.id'),
primarykey=True)
              Column('parent_id', Integer, ForiegnKey('base.id'))
              Column('name', Text))

item = Table('item',
              Column('id', Integer, ForiegnKey('base.id'),
primarykey=True)
              Column('parent_id', Integer, ForiegnKey('base.id'))
              Column('stuff', Text))

mapper(Dataset, dataset, inherits = base)
...

# Find a dataset owned by "me"
s = session.query(Dataset).filter(Dataset.owner =="me")
# Filter it so that it is tagged with "good"
s = s.query (and_(tag.name == "good", tag.parent_id = Dataset.id))
# Find all "something"s  in the above dataset
s = s._value(Dataset.c.something_id).statement
# The something are items with tags
# Find those items in the datasets (i.e. all that join w base)
q = session.query(Item).select_from (s)
q = q.filter (and_(tag.c.name=="really", tag.parent_id ==
dataset.c.id))
print q.all()

I think I want something like the following:

select item.id
from item,
     (select dataset.something_id from base, dataset
             where base.id = dataset.id and base.owner ='me'
                   tag.c.name="good" and tag.c.parent_id == base.id
      ) as datasetsomething
 where item.id = datasetsomthing.id
       and tag.c.name="good" and tag.c.parent_id == item.id

or even further as I think that subqueries are better
performing that massive self joins even when doing simple filtering:

select item.id
from item,
     (select dataset_me.something_id
             from (select * from base, dataset
                          where base.id = dataset.id and
base.owner="me")
                     as dataset_me
             where
                   tag.c.name="good" and tag.c.parent_id ==
dataset_me.id
      ) as datasetsomething
 where item.id = datasetsomthing.id
       and tag.c.name="good" and tag.c.parent_id == item.id

Thanks,
kris
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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