2011/11/29 Vishvananda Ishaya <vishvana...@gmail.com>:
> e) is the right solution imho.  The only reason joinedloads slipped in is for 
> efficiency reasons.
>
> In an ideal world the solution would be:
>
> 1) (explicitness) Every object or list of related objects is retrieved with 
> an explicit call:
>  instance = db.instance_get(id)
>  ifaces = db.interfaces_get_by_instance(id)
>  for iface in ifaces:
>     ip = db.fixed_ip_get_by_interface(iface['id'])
> 2) (efficiency) Queries are perfectly efficient and all joins that will be 
> used are made at once.
>  So the above would be a single db query that joins all instances ifaces and 
> ips.

The way I'd attack these expensive-if-done-one-at-a-time-but-dirt-cheap-
if-done-as-one-big-query is to have a method in the generic layer that
is taylored for this use case. E.g.

def instances_get_all_for_network_with_fixed_ip_addresses():
    retval =  []
    for inst in instance_get_all_by_network():
        x = inst.copy()
        x['fixed_ip_addresses'] = []
        for ip in fixed_ip_get_by_instance(inst['id']):
            x['fixed_ip_addresses'].append(ip['address'])
                retval.append(x)
    return x

And then, in the sqlalchemy driver, I could override that method with
one that issues a query with joinedloads and all the rest of it. The
intent is explicit, drivers that have no speedier way to achieve this
get a free implementation made up of the more primitive methods.

fixed_ip_get_by_instace might also have a default implementation that
issues a fixed_ip_get_all() and then filters the results. This way, a
new driver would be quick to add, and then we could optimize each query
as we move along.

-- 
Soren Hansen        | http://linux2go.dk/
Ubuntu Developer    | http://www.ubuntu.com/
OpenStack Developer | http://www.openstack.org/

_______________________________________________
Mailing list: https://launchpad.net/~openstack
Post to     : openstack@lists.launchpad.net
Unsubscribe : https://launchpad.net/~openstack
More help   : https://help.launchpad.net/ListHelp

Reply via email to