This is an automated email from the ASF dual-hosted git repository.

beto pushed a commit to branch lyftga
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/lyftga by this push:
     new c6876f7  Fix for tagging backend (#7240)
c6876f7 is described below

commit c6876f7829ee0adc3430ae5305ec05005402cb0d
Author: Beto Dealmeida <robe...@dealmeida.net>
AuthorDate: Mon Apr 8 11:06:45 2019 -0700

    Fix for tagging backend (#7240)
---
 superset/models/tags.py |   4 +-
 superset/views/tags.py  | 172 ++++++++++++++++++++++++++----------------------
 2 files changed, 96 insertions(+), 80 deletions(-)

diff --git a/superset/models/tags.py b/superset/models/tags.py
index 897c189..9c30f55 100644
--- a/superset/models/tags.py
+++ b/superset/models/tags.py
@@ -123,7 +123,7 @@ class ObjectUpdater(object):
             tagged_object = TaggedObject(
                 tag_id=tag.id,
                 object_id=target.id,
-                object_type=ObjectTypes.chart,
+                object_type=cls.object_type,
             )
             session.add(tagged_object)
 
@@ -141,7 +141,7 @@ class ObjectUpdater(object):
         tagged_object = TaggedObject(
             tag_id=tag.id,
             object_id=target.id,
-            object_type=ObjectTypes.query,
+            object_type=cls.object_type,
         )
         session.add(tagged_object)
 
diff --git a/superset/views/tags.py b/superset/views/tags.py
index fc34490..65cbbc9 100644
--- a/superset/views/tags.py
+++ b/superset/views/tags.py
@@ -30,7 +30,7 @@ from werkzeug.routing import BaseConverter
 
 from superset import app, appbuilder, db, utils
 from superset.jinja_context import current_user_id, current_username
-import superset.models.core
+from superset.models.core import Dashboard, Slice
 from superset.models.sql_lab import SavedQuery
 from superset.models.tags import ObjectTypes, Tag, TaggedObject, TagTypes
 from .base import BaseSupersetView, json_success
@@ -57,33 +57,6 @@ def process_template(content):
     return template.render(context)
 
 
-def get_name(obj):
-    if obj.Dashboard:
-        return obj.Dashboard.dashboard_title
-    elif obj.Slice:
-        return obj.Slice.slice_name
-    elif obj.SavedQuery:
-        return obj.SavedQuery.label
-
-
-def get_creator(obj):
-    if obj.Dashboard:
-        return obj.Dashboard.creator()
-    elif obj.Slice:
-        return obj.Slice.creator()
-    elif obj.SavedQuery:
-        return obj.SavedQuery.creator()
-
-
-def get_attribute(obj, attr):
-    if obj.Dashboard:
-        return getattr(obj.Dashboard, attr)
-    elif obj.Slice:
-        return getattr(obj.Slice, attr)
-    elif obj.SavedQuery:
-        return getattr(obj.SavedQuery, attr)
-
-
 class TagView(BaseSupersetView):
 
     @has_access_api
@@ -91,11 +64,13 @@ class TagView(BaseSupersetView):
     def suggestions(self):
         query = (
             db.session.query(TaggedObject)
-            .group_by(TaggedObject.tag_id)
+            .join(Tag)
+            .with_entities(TaggedObject.tag_id, Tag.name)
+            .group_by(TaggedObject.tag_id, Tag.name)
             .order_by(func.count().desc())
             .all()
         )
-        tags = [{'id': obj.tag.id, 'name': obj.tag.name} for obj in query]
+        tags = [{'id': id, 'name': name} for id, name in query]
         return json_success(json.dumps(tags))
 
     @has_access_api
@@ -157,60 +132,101 @@ class TagView(BaseSupersetView):
     @has_access_api
     @expose('/tagged_objects/', methods=['GET', 'POST'])
     def tagged_objects(self):
-        query = db.session.query(
-            TaggedObject,
-            superset.models.core.Dashboard,
-            superset.models.core.Slice,
-            SavedQuery,
-        ).join(Tag)
-
-        tags = request.args.get('tags')
+        tags = [
+            process_template(tag)
+            for tag in request.args.get('tags', '').split(',') if tag
+        ]
         if not tags:
             return json_success(json.dumps([]))
 
-        tags = [process_template(tag) for tag in tags.split(',')]
-        query = query.filter(Tag.name.in_(tags))
-
         # filter types
-        types = request.args.get('types')
-        if types:
-            query = 
query.filter(TaggedObject.object_type.in_(types.split(',')))
-
-        # get names
-        query = query.outerjoin(
-            superset.models.core.Dashboard,
-            and_(
-                TaggedObject.object_id == superset.models.core.Dashboard.id,
-                TaggedObject.object_type == ObjectTypes.dashboard,
-            ),
-        ).outerjoin(
-            superset.models.core.Slice,
-            and_(
-                TaggedObject.object_id == superset.models.core.Slice.id,
-                TaggedObject.object_type == ObjectTypes.chart,
-            ),
-        ).outerjoin(
-            SavedQuery,
-            and_(
-                TaggedObject.object_id == SavedQuery.id,
-                TaggedObject.object_type == ObjectTypes.query,
-            ),
-        ).group_by(TaggedObject.object_id, TaggedObject.object_type)
-
-        objects = [
-            {
-                'id': get_attribute(obj, 'id'),
-                'type': obj.TaggedObject.object_type.name,
-                'name': get_name(obj),
-                'url': get_attribute(obj, 'url'),
-                'changed_on': get_attribute(obj, 'changed_on'),
-                'created_by': get_attribute(obj, 'created_by_fk'),
-                'creator': get_creator(obj),
-            }
-            for obj in query if get_attribute(obj, 'id')
+        types = [
+            type_
+            for type_ in request.args.get('types', '').split(',')
+            if type_
         ]
 
-        return json_success(json.dumps(objects, 
default=utils.core.json_int_dttm_ser))
+        results = []
+
+        # dashboards
+        if not types or 'dashboard' in types:
+            dashboards = (
+                db.session.query(Dashboard)
+                .join(
+                    TaggedObject,
+                    and_(
+                        TaggedObject.object_id == Dashboard.id,
+                        TaggedObject.object_type == ObjectTypes.dashboard,
+                    ),
+                )
+                .join(Tag, TaggedObject.tag_id == Tag.id)
+                .filter(Tag.name.in_(tags))
+            )
+            results.extend(
+                {
+                    'id': obj.id,
+                    'type': ObjectTypes.dashboard.name,
+                    'name': obj.dashboard_title,
+                    'url': obj.url,
+                    'changed_on': obj.changed_on,
+                    'created_by': obj.created_by_fk,
+                    'creator': obj.creator(),
+                } for obj in dashboards
+            )
+
+        # charts
+        if not types or 'chart' in types:
+            charts = (
+                db.session.query(Slice)
+                .join(
+                    TaggedObject,
+                    and_(
+                        TaggedObject.object_id == Slice.id,
+                        TaggedObject.object_type == ObjectTypes.chart,
+                    ),
+                )
+                .join(Tag, TaggedObject.tag_id == Tag.id)
+                .filter(Tag.name.in_(tags))
+            )
+            results.extend(
+                {
+                    'id': obj.id,
+                    'type': ObjectTypes.chart.name,
+                    'name': obj.slice_name,
+                    'url': obj.url,
+                    'changed_on': obj.changed_on,
+                    'created_by': obj.created_by_fk,
+                    'creator': obj.creator(),
+                } for obj in charts
+            )
+
+        # saved queries
+        if not types or 'query' in types:
+            saved_queries = (
+                db.session.query(SavedQuery)
+                .join(
+                    TaggedObject,
+                    and_(
+                        TaggedObject.object_id == SavedQuery.id,
+                        TaggedObject.object_type == ObjectTypes.query,
+                    ),
+                )
+                .join(Tag, TaggedObject.tag_id == Tag.id)
+                .filter(Tag.name.in_(tags))
+            )
+            results.extend(
+                {
+                    'id': obj.id,
+                    'type': ObjectTypes.query.name,
+                    'name': obj.label,
+                    'url': obj.url,
+                    'changed_on': obj.changed_on,
+                    'created_by': obj.created_by_fk,
+                    'creator': obj.creator(),
+                } for obj in saved_queries
+            )
+
+        return json_success(json.dumps(results, 
default=utils.core.json_int_dttm_ser))
 
 
 app.url_map.converters['object_type'] = ObjectTypeConverter

Reply via email to