Re: [Sqlalchemy-tickets] [sqlalchemy] #2824: Add ability to query column sets as one entity
Brought to you by:
zzzeek
|
From: sqlalchemy <mi...@zz...> - 2013-09-17 22:42:57
|
#2824: Add ability to query column sets as one entity
-----------------------------------+---------------------------------------
Reporter: vmagamedov | Owner: zzzeek
Type: enhancement | Status: new
Priority: medium | Milestone: 0.9.xx
Component: orm | Severity: very major - up to 2 days
Resolution: | Keywords:
Progress State: not decided upon |
-----------------------------------+---------------------------------------
Changes (by zzzeek):
* severity: no triage selected yet => very major - up to 2 days
Comment:
this is a pretty lame proof of concept but im not very comfortable with
it, as it only would address your immediate concern which seems to be not
a broad enough case:
{{{
#!diff
diff --git a/lib/sqlalchemy/orm/loading.py b/lib/sqlalchemy/orm/loading.py
index 512a07d..5dc1184 100644
--- a/lib/sqlalchemy/orm/loading.py
+++ b/lib/sqlalchemy/orm/loading.py
@@ -42,8 +42,8 @@ def instances(query, cursor, context):
def filter_fn(row):
return tuple(fn(x) for x, fn in zip(row, filter_fns))
- custom_rows = single_entity and \
- query._entities[0].mapper.dispatch.append_result
+ custom_rows = False #single_entity and \
+ #query._entities[0].mapper.dispatch.append_result
(process, labels) = \
list(zip(*[
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index d64575a..01a7238 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -2890,6 +2890,8 @@ class _QueryEntity(object):
if not isinstance(entity, util.string_types) and \
_is_mapped_class(entity):
cls = _MapperEntity
+ elif isinstance(entity, UserDefinedEntity):
+ cls = _UserDefinedEntity
else:
cls = _ColumnEntity
return object.__new__(cls)
@@ -2900,6 +2902,35 @@ class _QueryEntity(object):
return q
+class UserDefinedEntity(object):
+ def setup_columns(self, column_collection, context):
+ pass
+
+ def process_rows(self, context):
+ pass
+
+
+class _UserDefinedEntity(_QueryEntity):
+ """User defined entity!"""
+
+ filter_fn = id
+
+ entities = ()
+
+ def __init__(self, query, entity):
+ query._entities.append(self)
+ self.entity = entity
+
+ def setup_entity(self, ext_info, aliased_adapter):
+ raise NotImplementedError()
+
+ def setup_context(self, query, context):
+ self.entity.setup_columns(context.primary_columns, context)
+
+ def row_processor(self, query, context, custom_rows):
+ return self.entity.process_rows(context)
+
+
class _MapperEntity(_QueryEntity):
"""mapper/class/AliasedClass entity"""
}}}
--
Ticket URL: <http://www.sqlalchemy.org/trac/ticket/2824#comment:6>
sqlalchemy <http://www.sqlalchemy.org/>
The Database Toolkit for Python
|