api: Rename get_old_messages to get_messages in the backend.

Fixes #1315.
This commit is contained in:
Tim Abbott
2017-03-23 23:51:46 -07:00
parent 95789eb879
commit 3617ebfd41
10 changed files with 94 additions and 94 deletions

View File

@@ -47,7 +47,7 @@ class ZulipSession extends Session
anchor: @pointer anchor: @pointer
num_before: 200 num_before: 200
num_after: 200 num_after: 200
}, get_old_messages_time.cbTimer cb }, get_messages_time.cbTimer cb
reload: (cb) -> reload: (cb) ->
@get '/', => @get '/', =>
@@ -105,7 +105,7 @@ class ZulipSession extends Session
setTimeout(@random_sends, @rand_time()) setTimeout(@random_sends, @rand_time())
# TODO: update_message_flags # TODO: update_message_flags
# TODO: get_old_messages # TODO: get_messages
run_message_test: => run_message_test: =>
@login => @login =>
@@ -158,7 +158,7 @@ stats = [
message_send_time = new Stat("Message Send Time") message_send_time = new Stat("Message Send Time")
update_status_time = new Stat("/json/update_status_time Time") update_status_time = new Stat("/json/update_status_time Time")
total_reload_time = new Stat("Total reload time") total_reload_time = new Stat("Total reload time")
get_old_messages_time = new Stat("/json/get_old_messages Time") get_messages_time = new Stat("/json/get_messages Time")
] ]
# Reset message latency stat after everyone logs in # Reset message latency stat after everyone logs in

View File

@@ -73,7 +73,7 @@ def fetch_initial_state_data(user_profile, event_types, queue_id,
state['attachments'] = user_attachments(user_profile) state['attachments'] = user_attachments(user_profile)
if want('message'): if want('message'):
# The client should use get_old_messages() to fetch messages # The client should use get_messages() to fetch messages
# starting with the max_message_id. They will get messages # starting with the max_message_id. They will get messages
# newer than that ID via get_events() # newer than that ID via get_events()
messages = Message.objects.filter(usermessage__user_profile=user_profile).order_by('-id')[:1] messages = Message.objects.filter(usermessage__user_profile=user_profile).order_by('-id')[:1]

View File

@@ -306,7 +306,7 @@ class ZulipTestCase(TestCase):
content, forged=False, forged_timestamp=None, content, forged=False, forged_timestamp=None,
forwarder_user_profile=sender, realm=sender.realm, **kwargs) forwarder_user_profile=sender, realm=sender.realm, **kwargs)
def get_old_messages(self, anchor=1, num_before=100, num_after=100): def get_messages(self, anchor=1, num_before=100, num_after=100):
# type: (int, int, int) -> List[Dict[str, Any]] # type: (int, int, int) -> List[Dict[str, Any]]
post_params = {"anchor": anchor, "num_before": num_before, post_params = {"anchor": anchor, "num_before": num_before,
"num_after": num_after} "num_after": num_after}

View File

@@ -1012,7 +1012,7 @@ class Message(ModelReprMixin, models.Model):
def get_raw_db_rows(needed_ids): def get_raw_db_rows(needed_ids):
# type: (List[int]) -> List[Dict[str, Any]] # type: (List[int]) -> List[Dict[str, Any]]
# This is a special purpose function optimized for # This is a special purpose function optimized for
# callers like get_old_messages_backend(). # callers like get_messages_backend().
fields = [ fields = [
'id', 'id',
'subject', 'subject',

View File

@@ -1679,7 +1679,7 @@ class StarTests(ZulipTestCase):
result = self.change_star(message_ids) result = self.change_star(message_ids)
self.assert_json_success(result) self.assert_json_success(result)
for msg in self.get_old_messages(): for msg in self.get_messages():
if msg['id'] in message_ids: if msg['id'] in message_ids:
self.assertEqual(msg['flags'], ['starred']) self.assertEqual(msg['flags'], ['starred'])
else: else:
@@ -1689,7 +1689,7 @@ class StarTests(ZulipTestCase):
self.assert_json_success(result) self.assert_json_success(result)
# Remove the stars. # Remove the stars.
for msg in self.get_old_messages(): for msg in self.get_messages():
if msg['id'] in message_ids: if msg['id'] in message_ids:
self.assertEqual(msg['flags'], []) self.assertEqual(msg['flags'], [])
@@ -1726,7 +1726,7 @@ class StarTests(ZulipTestCase):
result = self.change_star(message_ids) result = self.change_star(message_ids)
self.assert_json_success(result) self.assert_json_success(result)
for msg in self.get_old_messages(): for msg in self.get_messages():
if msg['id'] in message_ids + other_message_ids: if msg['id'] in message_ids + other_message_ids:
self.assertEqual(set(msg['flags']), {'starred', 'historical', 'read'}) self.assertEqual(set(msg['flags']), {'starred', 'historical', 'read'})
else: else:

View File

@@ -34,7 +34,7 @@ from zerver.lib.test_classes import (
) )
from zerver.views.messages import ( from zerver.views.messages import (
exclude_muting_conditions, exclude_muting_conditions,
get_old_messages_backend, ok_to_include_history, get_messages_backend, ok_to_include_history,
NarrowBuilder, BadNarrowOperator, Query, NarrowBuilder, BadNarrowOperator, Query,
LARGER_THAN_MAX_MESSAGE_ID, LARGER_THAN_MAX_MESSAGE_ID,
) )
@@ -431,7 +431,7 @@ class GetOldMessagesTest(ZulipTestCase):
return query_ids return query_ids
def test_successful_get_old_messages_reaction(self): def test_successful_get_messages_reaction(self):
# type: () -> None # type: () -> None
""" """
Test old `/json/messages` returns reactions. Test old `/json/messages` returns reactions.
@@ -459,7 +459,7 @@ class GetOldMessagesTest(ZulipTestCase):
self.assertEqual(message_to_assert['reactions'][0]['emoji_name'], self.assertEqual(message_to_assert['reactions'][0]['emoji_name'],
reaction_name) reaction_name)
def test_successful_get_old_messages(self): def test_successful_get_messages(self):
# type: () -> None # type: () -> None
""" """
A call to GET /json/messages with valid parameters returns a list of A call to GET /json/messages with valid parameters returns a list of
@@ -474,7 +474,7 @@ class GetOldMessagesTest(ZulipTestCase):
self.get_and_check_messages(dict(narrow=ujson.dumps([dict(operator='pm-with', operand='othello@zulip.com')]))) self.get_and_check_messages(dict(narrow=ujson.dumps([dict(operator='pm-with', operand='othello@zulip.com')])))
def test_get_old_messages_with_narrow_pm_with(self): def test_get_messages_with_narrow_pm_with(self):
# type: () -> None # type: () -> None
""" """
A request for old messages with a narrow by pm-with only returns A request for old messages with a narrow by pm-with only returns
@@ -504,7 +504,7 @@ class GetOldMessagesTest(ZulipTestCase):
for message in result["messages"]: for message in result["messages"]:
self.assertEqual(dr_emails(message['display_recipient']), emails) self.assertEqual(dr_emails(message['display_recipient']), emails)
def test_get_old_messages_with_narrow_stream(self): def test_get_messages_with_narrow_stream(self):
# type: () -> None # type: () -> None
""" """
A request for old messages with a narrow by stream only returns A request for old messages with a narrow by stream only returns
@@ -528,7 +528,7 @@ class GetOldMessagesTest(ZulipTestCase):
self.assertEqual(message["type"], "stream") self.assertEqual(message["type"], "stream")
self.assertEqual(message["recipient_id"], stream_id) self.assertEqual(message["recipient_id"], stream_id)
def test_get_old_messages_with_narrow_stream_mit_unicode_regex(self): def test_get_messages_with_narrow_stream_mit_unicode_regex(self):
# type: () -> None # type: () -> None
""" """
A request for old messages for a user in the mit.edu relam with unicode A request for old messages for a user in the mit.edu relam with unicode
@@ -560,7 +560,7 @@ class GetOldMessagesTest(ZulipTestCase):
stream_id = stream_messages[i].recipient.id stream_id = stream_messages[i].recipient.id
self.assertEqual(message["recipient_id"], stream_id) self.assertEqual(message["recipient_id"], stream_id)
def test_get_old_messages_with_narrow_stream_mit_unicode_null_regex(self): def test_get_messages_with_narrow_stream_mit_unicode_null_regex(self):
# type: () -> None # type: () -> None
self.login("starnine@mit.edu") self.login("starnine@mit.edu")
null_stream_name = u"foo\000-stream" null_stream_name = u"foo\000-stream"
@@ -576,7 +576,7 @@ class GetOldMessagesTest(ZulipTestCase):
self.assertEqual(result["messages"][0]["type"], "stream") self.assertEqual(result["messages"][0]["type"], "stream")
self.assertEqual(result["messages"][0]["recipient_id"], stream_messages[0].recipient.id) self.assertEqual(result["messages"][0]["recipient_id"], stream_messages[0].recipient.id)
def test_get_old_messages_with_narrow_topic_mit_unicode_regex(self): def test_get_messages_with_narrow_topic_mit_unicode_regex(self):
# type: () -> None # type: () -> None
""" """
A request for old messages for a user in the mit.edu realm with unicode A request for old messages for a user in the mit.edu realm with unicode
@@ -612,7 +612,7 @@ class GetOldMessagesTest(ZulipTestCase):
stream_id = stream_messages[i].recipient.id stream_id = stream_messages[i].recipient.id
self.assertEqual(message["recipient_id"], stream_id) self.assertEqual(message["recipient_id"], stream_id)
def test_get_old_messages_with_narrow_topic_mit_personal(self): def test_get_messages_with_narrow_topic_mit_personal(self):
# type: () -> None # type: () -> None
""" """
We handle .d grouping for MIT realm personal messages correctly. We handle .d grouping for MIT realm personal messages correctly.
@@ -652,7 +652,7 @@ class GetOldMessagesTest(ZulipTestCase):
stream_id = stream_messages[i].recipient.id stream_id = stream_messages[i].recipient.id
self.assertEqual(message["recipient_id"], stream_id) self.assertEqual(message["recipient_id"], stream_id)
def test_get_old_messages_with_narrow_sender(self): def test_get_messages_with_narrow_sender(self):
# type: () -> None # type: () -> None
""" """
A request for old messages with a narrow by sender only returns A request for old messages with a narrow by sender only returns
@@ -723,7 +723,7 @@ class GetOldMessagesTest(ZulipTestCase):
u'<p><span class="highlight">KEYWORDMATCH</span> and should work</p>') u'<p><span class="highlight">KEYWORDMATCH</span> and should work</p>')
@override_settings(USING_PGROONGA=False) @override_settings(USING_PGROONGA=False)
def test_get_old_messages_with_search(self): def test_get_messages_with_search(self):
# type: () -> None # type: () -> None
self.login("cordelia@zulip.com") self.login("cordelia@zulip.com")
@@ -789,7 +789,7 @@ class GetOldMessagesTest(ZulipTestCase):
self.assertEqual(multi_search_result['messages'][0]['match_content'], '<p><span class="highlight">discuss</span> lunch <span class="highlight">after</span> lunch</p>') self.assertEqual(multi_search_result['messages'][0]['match_content'], '<p><span class="highlight">discuss</span> lunch <span class="highlight">after</span> lunch</p>')
@override_settings(USING_PGROONGA=False) @override_settings(USING_PGROONGA=False)
def test_get_old_messages_with_search_not_subscribed(self): def test_get_messages_with_search_not_subscribed(self):
# type: () -> None # type: () -> None
"""Verify support for searching a stream you're not subscribed to""" """Verify support for searching a stream you're not subscribed to"""
self.subscribe_to_stream("hamlet@zulip.com", "newstream") self.subscribe_to_stream("hamlet@zulip.com", "newstream")
@@ -819,7 +819,7 @@ class GetOldMessagesTest(ZulipTestCase):
'<p>Public <span class="highlight">special</span> content!</p>') '<p>Public <span class="highlight">special</span> content!</p>')
@override_settings(USING_PGROONGA=True) @override_settings(USING_PGROONGA=True)
def test_get_old_messages_with_search_pgroonga(self): def test_get_messages_with_search_pgroonga(self):
# type: () -> None # type: () -> None
self.login("cordelia@zulip.com") self.login("cordelia@zulip.com")
@@ -891,7 +891,7 @@ class GetOldMessagesTest(ZulipTestCase):
self.assertEqual(len(multi_search_result['messages']), 1) self.assertEqual(len(multi_search_result['messages']), 1)
self.assertEqual(multi_search_result['messages'][0]['match_content'], '<p><span class="highlight">Can</span> you <span class="highlight">speak</span> Japanese?</p>') self.assertEqual(multi_search_result['messages'][0]['match_content'], '<p><span class="highlight">Can</span> you <span class="highlight">speak</span> Japanese?</p>')
def test_get_old_messages_with_only_searching_anchor(self): def test_get_messages_with_only_searching_anchor(self):
# type: () -> None # type: () -> None
""" """
Test that specifying an anchor but 0 for num_before and num_after Test that specifying an anchor but 0 for num_before and num_after
@@ -916,7 +916,7 @@ class GetOldMessagesTest(ZulipTestCase):
# type: () -> None # type: () -> None
""" """
anchor, num_before, and num_after are all required anchor, num_before, and num_after are all required
POST parameters for get_old_messages. POST parameters for get_messages.
""" """
self.login("hamlet@zulip.com") self.login("hamlet@zulip.com")
@@ -1006,7 +1006,7 @@ class GetOldMessagesTest(ZulipTestCase):
def test_bad_narrow_stream_content(self): def test_bad_narrow_stream_content(self):
# type: () -> None # type: () -> None
""" """
If an invalid stream name is requested in get_old_messages, an error is If an invalid stream name is requested in get_messages, an error is
returned. returned.
""" """
self.login("hamlet@zulip.com") self.login("hamlet@zulip.com")
@@ -1017,7 +1017,7 @@ class GetOldMessagesTest(ZulipTestCase):
def test_bad_narrow_one_on_one_email_content(self): def test_bad_narrow_one_on_one_email_content(self):
# type: () -> None # type: () -> None
""" """
If an invalid 'pm-with' is requested in get_old_messages, an If an invalid 'pm-with' is requested in get_messages, an
error is returned. error is returned.
""" """
self.login("hamlet@zulip.com") self.login("hamlet@zulip.com")
@@ -1047,19 +1047,19 @@ class GetOldMessagesTest(ZulipTestCase):
d = MessageDict.to_dict_uncached_helper(m, True) d = MessageDict.to_dict_uncached_helper(m, True)
self.assertEqual(d['content'], '<p>test content</p>') self.assertEqual(d['content'], '<p>test content</p>')
def common_check_get_old_messages_query(self, query_params, expected): def common_check_get_messages_query(self, query_params, expected):
# type: (Dict[str, object], Text) -> None # type: (Dict[str, object], Text) -> None
user_profile = get_user_profile_by_email("hamlet@zulip.com") user_profile = get_user_profile_by_email("hamlet@zulip.com")
request = POSTRequestMock(query_params, user_profile) request = POSTRequestMock(query_params, user_profile)
with queries_captured() as queries: with queries_captured() as queries:
get_old_messages_backend(request, user_profile) get_messages_backend(request, user_profile)
for query in queries: for query in queries:
if "/* get_old_messages */" in query['sql']: if "/* get_messages */" in query['sql']:
sql = str(query['sql']).replace(" /* get_old_messages */", '') sql = str(query['sql']).replace(" /* get_messages */", '')
self.assertEqual(sql, expected) self.assertEqual(sql, expected)
return return
raise AssertionError("get_old_messages query not found") raise AssertionError("get_messages query not found")
def test_use_first_unread_anchor_with_some_unread_messages(self): def test_use_first_unread_anchor_with_some_unread_messages(self):
# type: () -> None # type: () -> None
@@ -1084,10 +1084,10 @@ class GetOldMessagesTest(ZulipTestCase):
request = POSTRequestMock(query_params, user_profile) request = POSTRequestMock(query_params, user_profile)
with queries_captured() as all_queries: with queries_captured() as all_queries:
get_old_messages_backend(request, user_profile) get_messages_backend(request, user_profile)
# Verify the query for old messages looks correct. # Verify the query for old messages looks correct.
queries = [q for q in all_queries if '/* get_old_messages */' in q['sql']] queries = [q for q in all_queries if '/* get_messages */' in q['sql']]
self.assertEqual(len(queries), 1) self.assertEqual(len(queries), 1)
sql = queries[0]['sql'] sql = queries[0]['sql']
self.assertNotIn('AND message_id = %s' % (LARGER_THAN_MAX_MESSAGE_ID,), sql) self.assertNotIn('AND message_id = %s' % (LARGER_THAN_MAX_MESSAGE_ID,), sql)
@@ -1112,11 +1112,11 @@ class GetOldMessagesTest(ZulipTestCase):
request = POSTRequestMock(query_params, user_profile) request = POSTRequestMock(query_params, user_profile)
with queries_captured() as all_queries: with queries_captured() as all_queries:
get_old_messages_backend(request, user_profile) get_messages_backend(request, user_profile)
# Next, verify the use_first_unread_anchor setting invokes # Next, verify the use_first_unread_anchor setting invokes
# the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack. # the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack.
queries = [q for q in all_queries if '/* get_old_messages */' in q['sql']] queries = [q for q in all_queries if '/* get_messages */' in q['sql']]
self.assertEqual(len(queries), 1) self.assertEqual(len(queries), 1)
self.assertIn('AND message_id <= %d' % (LARGER_THAN_MAX_MESSAGE_ID - 1,), queries[0]['sql']) self.assertIn('AND message_id <= %d' % (LARGER_THAN_MAX_MESSAGE_ID - 1,), queries[0]['sql'])
# There should not be an after_query in this case, since it'd be useless # There should not be an after_query in this case, since it'd be useless
@@ -1127,11 +1127,11 @@ class GetOldMessagesTest(ZulipTestCase):
""" """
Test that our logic related to `use_first_unread_anchor` Test that our logic related to `use_first_unread_anchor`
invokes the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack for invokes the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack for
the `/* get_old_messages */` query when relevant muting the `/* get_messages */` query when relevant muting
is in effect. is in effect.
This is a very arcane test on arcane, but very heavily This is a very arcane test on arcane, but very heavily
field-tested, logic in get_old_messages_backend(). If field-tested, logic in get_messages_backend(). If
this test breaks, be absolutely sure you know what you're this test breaks, be absolutely sure you know what you're
doing. doing.
""" """
@@ -1152,7 +1152,7 @@ class GetOldMessagesTest(ZulipTestCase):
request = POSTRequestMock(query_params, user_profile) request = POSTRequestMock(query_params, user_profile)
with queries_captured() as all_queries: with queries_captured() as all_queries:
get_old_messages_backend(request, user_profile) get_messages_backend(request, user_profile)
# Do some tests on the main query, to verify the muting logic # Do some tests on the main query, to verify the muting logic
# runs on this code path. # runs on this code path.
@@ -1166,7 +1166,7 @@ class GetOldMessagesTest(ZulipTestCase):
# Next, verify the use_first_unread_anchor setting invokes # Next, verify the use_first_unread_anchor setting invokes
# the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack. # the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack.
queries = [q for q in all_queries if '/* get_old_messages */' in q['sql']] queries = [q for q in all_queries if '/* get_messages */' in q['sql']]
self.assertEqual(len(queries), 1) self.assertEqual(len(queries), 1)
self.assertIn('AND message_id = %d' % (LARGER_THAN_MAX_MESSAGE_ID,), self.assertIn('AND message_id = %d' % (LARGER_THAN_MAX_MESSAGE_ID,),
queries[0]['sql']) queries[0]['sql'])
@@ -1233,94 +1233,94 @@ class GetOldMessagesTest(ZulipTestCase):
self.assertEqual(params['recipient_id_3'], get_recipient_id_for_stream_name(realm, 'web stuff')) self.assertEqual(params['recipient_id_3'], get_recipient_id_for_stream_name(realm, 'web stuff'))
self.assertEqual(params['upper_2'], 'css') self.assertEqual(params['upper_2'], 'css')
def test_get_old_messages_queries(self): def test_get_messages_queries(self):
# type: () -> None # type: () -> None
query_ids = self.get_query_ids() query_ids = self.get_query_ids()
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 11) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 11) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10}, sql) self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10}, sql)
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id <= 100 ORDER BY message_id DESC \n LIMIT 11) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id <= 100 ORDER BY message_id DESC \n LIMIT 11) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 100, 'num_before': 10, 'num_after': 0}, sql) self.common_check_get_messages_query({'anchor': 100, 'num_before': 10, 'num_after': 0}, sql)
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM ((SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id <= 99 ORDER BY message_id DESC \n LIMIT 10) UNION ALL (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id ASC \n LIMIT 11)) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM ((SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id <= 99 ORDER BY message_id DESC \n LIMIT 10) UNION ALL (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id ASC \n LIMIT 11)) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 100, 'num_before': 10, 'num_after': 10}, sql) self.common_check_get_messages_query({'anchor': 100, 'num_before': 10, 'num_after': 10}, sql)
def test_get_old_messages_with_narrow_queries(self): def test_get_messages_with_narrow_queries(self):
# type: () -> None # type: () -> None
query_ids = self.get_query_ids() query_ids = self.get_query_ids()
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["pm-with", "othello@zulip.com"]]'}, 'narrow': '[["pm-with", "othello@zulip.com"]]'},
sql) sql)
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (flags & 2) != 0 AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (flags & 2) != 0 AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["is", "starred"]]'}, 'narrow': '[["is", "starred"]]'},
sql) sql)
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND sender_id = {othello_id} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND sender_id = {othello_id} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["sender", "othello@zulip.com"]]'}, 'narrow': '[["sender", "othello@zulip.com"]]'},
sql) sql)
sql_template = 'SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["stream", "Scotland"]]'}, 'narrow': '[["stream", "Scotland"]]'},
sql) sql)
sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND upper(subject) = upper('blah') AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND upper(subject) = upper('blah') AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC"
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["topic", "blah"]]'}, 'narrow': '[["topic", "blah"]]'},
sql) sql)
sql_template = "SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND upper(subject) = upper('blah') AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" sql_template = "SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND upper(subject) = upper('blah') AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC"
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["stream", "Scotland"], ["topic", "blah"]]'}, 'narrow': '[["stream", "Scotland"], ["topic", "blah"]]'},
sql) sql)
# Narrow to pms with yourself # Narrow to pms with yourself
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND sender_id = {hamlet_id} AND recipient_id = {hamlet_recipient} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND sender_id = {hamlet_id} AND recipient_id = {hamlet_recipient} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["pm-with", "hamlet@zulip.com"]]'}, 'narrow': '[["pm-with", "hamlet@zulip.com"]]'},
sql) sql)
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND recipient_id = {scotland_recipient} AND (flags & 2) != 0 AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND recipient_id = {scotland_recipient} AND (flags & 2) != 0 AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["stream", "Scotland"], ["is", "starred"]]'}, 'narrow': '[["stream", "Scotland"], ["is", "starred"]]'},
sql) sql)
@override_settings(USING_PGROONGA=False) @override_settings(USING_PGROONGA=False)
def test_get_old_messages_with_search_queries(self): def test_get_messages_with_search_queries(self):
# type: () -> None # type: () -> None
query_ids = self.get_query_ids() query_ids = self.get_query_ids()
sql_template = "SELECT anon_1.message_id, anon_1.flags, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT message_id, flags, subject, rendered_content, ts_match_locs_array('zulip.english_us_search', rendered_content, plainto_tsquery('zulip.english_us_search', 'jumping')) AS content_matches, ts_match_locs_array('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', 'jumping')) AS subject_matches \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" # type: Text sql_template = "SELECT anon_1.message_id, anon_1.flags, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT message_id, flags, subject, rendered_content, ts_match_locs_array('zulip.english_us_search', rendered_content, plainto_tsquery('zulip.english_us_search', 'jumping')) AS content_matches, ts_match_locs_array('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', 'jumping')) AS subject_matches \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" # type: Text
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["search", "jumping"]]'}, 'narrow': '[["search", "jumping"]]'},
sql) sql)
sql_template = "SELECT anon_1.message_id, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT id AS message_id, subject, rendered_content, ts_match_locs_array('zulip.english_us_search', rendered_content, plainto_tsquery('zulip.english_us_search', 'jumping')) AS content_matches, ts_match_locs_array('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', 'jumping')) AS subject_matches \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" sql_template = "SELECT anon_1.message_id, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT id AS message_id, subject, rendered_content, ts_match_locs_array('zulip.english_us_search', rendered_content, plainto_tsquery('zulip.english_us_search', 'jumping')) AS content_matches, ts_match_locs_array('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', 'jumping')) AS subject_matches \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC"
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["stream", "Scotland"], ["search", "jumping"]]'}, 'narrow': '[["stream", "Scotland"], ["search", "jumping"]]'},
sql) sql)
sql_template = 'SELECT anon_1.message_id, anon_1.flags, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT message_id, flags, subject, rendered_content, ts_match_locs_array(\'zulip.english_us_search\', rendered_content, plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AS content_matches, ts_match_locs_array(\'zulip.english_us_search\', escape_html(subject), plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AS subject_matches \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (content ILIKE \'%jumping%\' OR subject ILIKE \'%jumping%\') AND (search_tsvector @@ plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC' sql_template = 'SELECT anon_1.message_id, anon_1.flags, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT message_id, flags, subject, rendered_content, ts_match_locs_array(\'zulip.english_us_search\', rendered_content, plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AS content_matches, ts_match_locs_array(\'zulip.english_us_search\', escape_html(subject), plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AS subject_matches \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (content ILIKE \'%jumping%\' OR subject ILIKE \'%jumping%\') AND (search_tsvector @@ plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
sql = sql_template.format(**query_ids) sql = sql_template.format(**query_ids)
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10, self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
'narrow': '[["search", "\\"jumping\\" quickly"]]'}, 'narrow': '[["search", "\\"jumping\\" quickly"]]'},
sql) sql)

View File

@@ -111,7 +111,7 @@ class UnreadCountTests(ZulipTestCase):
# Ensure we properly set the flags # Ensure we properly set the flags
found = 0 found = 0
for msg in self.get_old_messages(): for msg in self.get_messages():
if msg['id'] in self.unread_msg_ids: if msg['id'] in self.unread_msg_ids:
self.assertEqual(msg['flags'], ['read']) self.assertEqual(msg['flags'], ['read'])
found += 1 found += 1
@@ -123,7 +123,7 @@ class UnreadCountTests(ZulipTestCase):
self.assert_json_success(result) self.assert_json_success(result)
# Ensure we properly remove just one flag # Ensure we properly remove just one flag
for msg in self.get_old_messages(): for msg in self.get_messages():
if msg['id'] == self.unread_msg_ids[0]: if msg['id'] == self.unread_msg_ids[0]:
self.assertEqual(msg['flags'], ['read']) self.assertEqual(msg['flags'], ['read'])
elif msg['id'] == self.unread_msg_ids[1]: elif msg['id'] == self.unread_msg_ids[1]:
@@ -149,7 +149,7 @@ class UnreadCountTests(ZulipTestCase):
"all": ujson.dumps(True)}) "all": ujson.dumps(True)})
self.assert_json_success(result) self.assert_json_success(result)
for msg in self.get_old_messages(): for msg in self.get_messages():
self.assertEqual(msg['flags'], []) self.assertEqual(msg['flags'], [])
def test_mark_all_in_stream_read(self): def test_mark_all_in_stream_read(self):

View File

@@ -528,14 +528,14 @@ def exclude_muting_conditions(user_profile, narrow):
return conditions return conditions
@has_request_variables @has_request_variables
def get_old_messages_backend(request, user_profile, def get_messages_backend(request, user_profile,
anchor = REQ(converter=int), anchor = REQ(converter=int),
num_before = REQ(converter=to_non_negative_int), num_before = REQ(converter=to_non_negative_int),
num_after = REQ(converter=to_non_negative_int), num_after = REQ(converter=to_non_negative_int),
narrow = REQ('narrow', converter=narrow_parameter, default=None), narrow = REQ('narrow', converter=narrow_parameter, default=None),
use_first_unread_anchor = REQ(default=False, converter=ujson.loads), use_first_unread_anchor = REQ(default=False, converter=ujson.loads),
apply_markdown=REQ(default=True, apply_markdown=REQ(default=True,
converter=ujson.loads)): converter=ujson.loads)):
# type: (HttpRequest, UserProfile, int, int, int, Optional[List[Dict[str, Any]]], bool, bool) -> HttpResponse # type: (HttpRequest, UserProfile, int, int, int, Optional[List[Dict[str, Any]]], bool, bool) -> HttpResponse
include_history = ok_to_include_history(narrow, user_profile.realm) include_history = ok_to_include_history(narrow, user_profile.realm)
@@ -645,7 +645,7 @@ def get_old_messages_backend(request, user_profile,
main_query = alias(query) main_query = alias(query)
query = select(main_query.c, None, main_query).order_by(column("message_id").asc()) query = select(main_query.c, None, main_query).order_by(column("message_id").asc())
# This is a hack to tag the query we use for testing # This is a hack to tag the query we use for testing
query = query.prefix_with("/* get_old_messages */") query = query.prefix_with("/* get_messages */")
query_result = list(sa_conn.execute(query).fetchall()) query_result = list(sa_conn.execute(query).fetchall())
# The following is a little messy, but ensures that the code paths # The following is a little messy, but ensures that the code paths

View File

@@ -5,7 +5,7 @@ from django.http import HttpRequest, HttpResponse
from optparse import make_option from optparse import make_option
from django.core.management.base import BaseCommand, CommandParser from django.core.management.base import BaseCommand, CommandParser
from zerver.models import get_user_profile_by_email, UserMessage from zerver.models import get_user_profile_by_email, UserMessage
from zerver.views.messages import get_old_messages_backend from zerver.views.messages import get_messages_backend
import cProfile import cProfile
import logging import logging
from zerver.middleware import LogRequests from zerver.middleware import LogRequests
@@ -41,8 +41,8 @@ def profile_request(request):
request_logger.process_request(request) request_logger.process_request(request)
prof = cProfile.Profile() prof = cProfile.Profile()
prof.enable() prof.enable()
ret = get_old_messages_backend(request, request.user, ret = get_messages_backend(request, request.user,
apply_markdown=True) apply_markdown=True)
prof.disable() prof.disable()
prof.dump_stats("/tmp/profile.data") prof.dump_stats("/tmp/profile.data")
request_logger.process_response(request, ret) request_logger.process_response(request, ret)

View File

@@ -229,7 +229,7 @@ v1_api_and_json_patterns = [
# messages -> zerver.views.messages # messages -> zerver.views.messages
# GET returns messages, possibly filtered, POST sends a message # GET returns messages, possibly filtered, POST sends a message
url(r'^messages$', rest_dispatch, url(r'^messages$', rest_dispatch,
{'GET': 'zerver.views.messages.get_old_messages_backend', {'GET': 'zerver.views.messages.get_messages_backend',
'POST': 'zerver.views.messages.send_message_backend'}), 'POST': 'zerver.views.messages.send_message_backend'}),
url(r'^messages/(?P<message_id>[0-9]+)$', rest_dispatch, url(r'^messages/(?P<message_id>[0-9]+)$', rest_dispatch,
{'GET': 'zerver.views.messages.json_fetch_raw_message', {'GET': 'zerver.views.messages.json_fetch_raw_message',