Skip to content

Commit

Permalink
some optimize for query
Browse files Browse the repository at this point in the history
  • Loading branch information
selfboot committed Sep 8, 2016
1 parent 59ed892 commit d3cf134
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 27 deletions.
4 changes: 2 additions & 2 deletions nahan/brother/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: xuezaigds@gmail.com
# @Last Modified time: 2016-07-18 21:33:38
# @Last Modified time: 2016-09-08 18:06:32

from flask import render_template, redirect, request, url_for, abort, current_app, jsonify
from flask_login import login_user, logout_user, current_user
Expand Down Expand Up @@ -214,7 +214,7 @@ def topic_table_list():
length = int(request.args.get('iDisplayLength', 10))
start = int(request.args.get('iDisplayStart', 0))

topics = list(filter(lambda x: x.deleted == status, Topic.query.all()))
topics = Topic.query.filter_by(deleted=status).all()
map(lambda x: setattr(x, 'username', x.user().username), topics)
map(lambda x: setattr(x, 'node_title', x.node().title), topics)

Expand Down
39 changes: 33 additions & 6 deletions nahan/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: xuezaigds@gmail.com
# @Last Modified time: 2016-09-07 23:23:20
# @Last Modified time: 2016-09-08 18:09:26

import markdown
from datetime import datetime
Expand All @@ -12,6 +12,8 @@
from . import db, login_manager
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.sql.functions import concat
from sqlalchemy.sql.expression import true
from sqlalchemy.sql import or_


class User(UserMixin, db.Model):
Expand Down Expand Up @@ -166,13 +168,22 @@ def __init__(self, user_id, title, content, node_id):
appends = db.Column(db.Text(), default="")
comments = db.Column(db.Text(), default="")

@property
@hybrid_property
def deleted(self):
return self.topic_deleted or self.node_deleted or self.user_deleted

@deleted.expression
def deleted(cls):
return or_(cls.topic_deleted == true(),
cls.node_deleted == true(),
cls.user_deleted == true())

# You may like to read:
# http://stackoverflow.com/questions/39346777/python-sqlalchemy-filter-records-that-all-the-keys-in-a-list-appear-in-either-of
@hybrid_property
def title_content(self):
return '{0} {1}'.format(self.title, self.content)
return '{0} {1}'.format(self.title.encode('utf-8'),
self.content.encode('utf-8'))

@title_content.expression
def title_content(cls):
Expand Down Expand Up @@ -257,10 +268,15 @@ def __init__(self, content, topic_id):
topic_deleted = db.Column(db.Boolean(), default=False)
append_deleted = db.Column(db.Boolean(), default=False)

@property
@hybrid_property
def deleted(self):
return self.topic_deleted or self.append_deleted

@deleted.expression
def deleted(cls):
return or_(cls.topic_deleted == true(),
cls.append_deleted == true())

def process(self, status, cause):
""" Reset the status of the topic appendix and relevant notify.
Expand Down Expand Up @@ -306,10 +322,15 @@ def __init__(self, content, user_id, topic_id):
user_deleted = db.Column(db.Boolean(), default=False)
comment_deleted = db.Column(db.Boolean(), default=False)

@property
@hybrid_property
def deleted(self):
return self.topic_deleted or self.comment_deleted

@deleted.expression
def deleted(cls):
return or_(cls.topic_deleted == true(),
cls.comment_deleted == true())

def user(self):
return User.query.filter_by(id=self.user_id).first()

Expand Down Expand Up @@ -407,10 +428,16 @@ def __init__(self, sender_id, receiver_id, topic_id, comment_id=None, append_id=
topic_deleted = db.Column(db.Boolean(), default=False)
comment_deleted = db.Column(db.Boolean(), default=False)

@property
@hybrid_property
def deleted(self):
return self.append_deleted or self.topic_deleted or self.comment_deleted

@deleted.expression
def deleted(cls):
return or_(cls.append_deleted == true(),
cls.topic_deleted == true(),
cls.comment_deleted == true())

@property
def topic(self):
return Topic.query.filter_by(id=self.topic_id).first()
Expand Down
6 changes: 3 additions & 3 deletions nahan/user/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: xuezaigds@gmail.com
# @Last Modified time: 2016-07-01 09:44:09
# @Last Modified time: 2016-09-08 16:27:23

from flask import render_template, redirect, request, url_for, abort, current_app
from flask_login import login_user, logout_user, login_required, current_user
Expand Down Expand Up @@ -175,10 +175,10 @@ def info(uid):

per_page = current_app.config['PER_PAGE']
page = int(request.args.get('page', 1))
offset = (page-1)*per_page
offset = (page - 1) * per_page
topics_all = list(filter(lambda t: not t.deleted, u.extract_topics()))
topics_all.sort(key=lambda t: (t.reply_count, t.click), reverse=True)
topics = topics_all[offset:offset+per_page]
topics = topics_all[offset:offset + per_page]
pagination = Pagination(page=page, total=len(topics_all),
per_page=per_page,
record_name='topics',
Expand Down
33 changes: 17 additions & 16 deletions nahan/voice/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: xuezaigds@gmail.com
# @Last Modified time: 2016-09-07 21:53:34
# @Last Modified time: 2016-09-08 18:30:34

from flask import render_template, redirect, request, url_for, abort, current_app
from . import voice
Expand All @@ -21,10 +21,12 @@ def index():
per_page = current_app.config['PER_PAGE']
page = int(request.args.get('page', 1))
offset = (page - 1) * per_page
topics_all = list(filter(lambda t: not t.deleted, Topic.query.all()))
topics_all.sort(key=lambda t: (t.time_created), reverse=True)
# topics_all = list(filter(lambda t: not t.deleted, Topic.query.all()))
# topics_all.sort(key=lambda t: (t.time_created), reverse=True)
topics_all = Topic.query.filter_by(deleted=False).order_by(
Topic.time_created.desc()).limit(per_page + offset)
topics = topics_all[offset:offset + per_page]
pagination = Pagination(page=page, total=len(topics_all),
pagination = Pagination(page=page, total=Topic.query.count(),
per_page=per_page,
record_name='topics',
CSS_FRAMEWORK='bootstrap',
Expand All @@ -45,11 +47,12 @@ def hot():
per_page = current_app.config['PER_PAGE']
page = int(request.args.get('page', 1))
offset = (page - 1) * per_page
topics_all = list(filter(lambda t: not t.deleted, Topic.query.all()))
topics_all.sort(key=lambda t: (t.reply_count, t.click), reverse=True)
topics_all = topics_all[:120]

topics_all = Topic.query.filter_by(deleted=False).order_by(
Topic.reply_count.desc(), Topic.click.desc()).limit(per_page + offset)

topics = topics_all[offset:offset + per_page]
pagination = Pagination(page=page, total=len(topics_all),
pagination = Pagination(page=page, total=Topic.query.count(),
per_page=per_page,
record_name='topics',
CSS_FRAMEWORK='bootstrap',
Expand Down Expand Up @@ -270,21 +273,19 @@ def node_view(nid):
page = int(request.args.get('page', 1))
offset = (page - 1) * per_page

topics_all = list(filter(lambda t: not t.deleted,
Topic.query.filter_by(node_id=nid)))
topics_all.sort(key=lambda t: (t.reply_count, t.click), reverse=True)
topics_all = topics_all[:120]
topics_all = Topic.query.filter_by(node_id=nid, deleted=False).order_by(
Topic.time_created.desc()).limit(per_page + offset)
topics = topics_all[offset:offset + per_page]
pagination = Pagination(page=page, total=len(topics_all),
pagination = Pagination(page=page,
total=Topic.query.filter_by(node_id=nid).count(),
per_page=per_page,
record_name='topics',
CSS_FRAMEWORK='bootstrap',
bs_version=3)
return render_template('voice/node_view.html',
topics=topics,
title=gettext('Node view'),
post_list_title=gettext(
"Node ") + node_title + gettext("'s topics"),
post_list_title=gettext("Node ") + node_title + gettext("'s topics"),
pagination=pagination)
return render_template('voice/node_view.html')

Expand All @@ -300,11 +301,11 @@ def search(keywords):
query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))
query.filter(or_(User.name == 'ed', User.name == 'wendy'))
"""

keys = keywords.split(' ')
all_topics = (Topic.query.filter(
and_(*[Topic.title_content.like("%" + k + "%") for k in keys])).all())

print "AAA", all_topics[0].topic_deleted, all_topics[0].deleted
all_topics = list(filter(lambda x: not x.deleted, all_topics))
all_topics.sort(key=lambda x: x.time_created, reverse=True)

Expand Down

0 comments on commit d3cf134

Please sign in to comment.