OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from datetime import datetime | 5 from datetime import datetime |
6 import logging | 6 import logging |
7 import traceback | 7 import traceback |
8 | 8 |
9 from google.appengine.datastore.datastore_query import Cursor | 9 from google.appengine.datastore.datastore_query import Cursor |
10 import webapp2 | 10 import webapp2 |
(...skipping 11 matching lines...) Expand all Loading... |
22 ) | 22 ) |
23 from shared import utils | 23 from shared import utils |
24 | 24 |
25 def has_end_timestamp( | 25 def has_end_timestamp( |
26 cache_timestamp, # pylint: disable=W0613 | 26 cache_timestamp, # pylint: disable=W0613 |
27 kwargs): | 27 kwargs): |
28 end = kwargs.get('end') | 28 end = kwargs.get('end') |
29 return end and end < datetime.utcnow() | 29 return end and end < datetime.utcnow() |
30 | 30 |
31 @utils.memcachize(cache_check=has_end_timestamp) | 31 @utils.memcachize(cache_check=has_end_timestamp) |
32 def execute_query( | 32 def execute_query(key, begin, end, tags, fields, count, cursor): |
33 key, begin, end, tags, fields, count, cursor): | |
34 records = [] | 33 records = [] |
35 next_cursor = '' | 34 next_cursor = '' |
36 if key and count > 0: | 35 if key and count > 0: |
37 record = Record.get_by_id(key) | 36 record = Record.get_by_id(key) |
38 if record and ( | 37 if record and ( |
39 (not begin or record.timestamp >= begin) and | 38 (not begin or record.timestamp >= begin) and |
40 (not end or record.timestamp <= end) and | 39 (not end or record.timestamp <= end) and |
41 set(tags).issubset(record.tags) and | 40 set(tags).issubset(record.tags) and |
42 matches_fields(fields, record)): | 41 matches_fields(fields, record)): |
43 records.append(record) | 42 records.append(record) |
(...skipping 23 matching lines...) Expand all Loading... |
67 } | 66 } |
68 | 67 |
69 def matches_fields(fields, record): | 68 def matches_fields(fields, record): |
70 for field, value in fields.items(): | 69 for field, value in fields.items(): |
71 if not field in record.fields or record.fields[field] != value: | 70 if not field in record.fields or record.fields[field] != value: |
72 return False | 71 return False |
73 return True | 72 return True |
74 | 73 |
75 class Query(webapp2.RequestHandler): | 74 class Query(webapp2.RequestHandler): |
76 @utils.cross_origin_json | 75 @utils.cross_origin_json |
| 76 @utils.read_access |
77 def get(self, url_tags): # pylint: disable=W0221 | 77 def get(self, url_tags): # pylint: disable=W0221 |
78 try: | 78 try: |
79 params = parse_request(self.request, { | 79 params = parse_request(self.request, { |
80 'begin': parse_timestamp, | 80 'begin': parse_timestamp, |
81 'end': parse_timestamp, | 81 'end': parse_timestamp, |
82 'key': parse_record_key, | 82 'key': parse_record_key, |
83 'tags': parse_strings, | 83 'tags': parse_strings, |
84 'fields': parse_fields, | 84 'fields': parse_fields, |
85 'count': parse_query_count, | 85 'count': parse_query_count, |
86 'cursor': parse_cursor, | 86 'cursor': parse_cursor, |
87 }) | 87 }) |
88 params['tags'].extend(parse_url_tags(url_tags)) | 88 params['tags'].extend(parse_url_tags(url_tags)) |
89 return execute_query(**params) | 89 return execute_query(**params) |
90 except ValueError as e: | 90 except ValueError as e: |
91 logging.warning(traceback.format_exc()) | 91 logging.warning(traceback.format_exc()) |
92 self.response.write(e) | 92 self.response.write(e) |
OLD | NEW |