def post(self, sketch_id): """Handles GET request to the resource. Args: sketch_id: Integer primary key for a sketch database model story_id: Integer primary key for a story database model Returns: A story in JSON (instance of flask.wrappers.Response) """ form = ExploreForm.build(request) if form.validate_on_submit(): sketch = Sketch.query.get_with_acl(sketch_id) schema = {u'objects': [], u'meta': {}} query_string = form.query.data query_filter = form.filter.data query_dsl = form.dsl.data query = self.datastore.build_query(sketch.id, query_string, query_filter, query_dsl) schema[u'objects'].append(query) return jsonify(schema) return abort(HTTP_STATUS_CODE_BAD_REQUEST)
def post(self, sketch_id): """Handles POST request to the resource. Handler for /api/v1/sketches/:sketch_id/explore/ Args: sketch_id: Integer primary key for a sketch database model Returns: JSON with list of matched events """ sketch = Sketch.query.get_with_acl(sketch_id) form = ExploreForm.build(request) if form.validate_on_submit(): query_dsl = form.dsl.data query_filter = form.filter.data sketch_indices = { t.searchindex.index_name for t in sketch.timelines } indices = query_filter.get(u'indices', sketch_indices) # If _all in indices then execute the query on all indices if u'_all' in indices: indices = sketch_indices # Make sure that the indices in the filter are part of the sketch if set(indices) - set(sketch_indices): abort(HTTP_STATUS_CODE_BAD_REQUEST) # Make sure we have a query string or star filter if not (form.query.data, query_filter.get(u'star'), query_filter.get(u'events'), query_dsl): abort(HTTP_STATUS_CODE_BAD_REQUEST) result = self.datastore.search(sketch_id, form.query.data, query_filter, query_dsl, indices, aggregations=None, return_results=True) # Get labels for each event that matches the sketch. # Remove all other labels. for event in result[u'hits'][u'hits']: event[u'selected'] = False event[u'_source'][u'label'] = [] try: for label in event[u'_source'][u'timesketch_label']: if sketch.id != label[u'sketch_id']: continue event[u'_source'][u'label'].append(label[u'name']) del event[u'_source'][u'timesketch_label'] except KeyError: pass # Update or create user state view. This is used in the UI to let # the user get back to the last state in the explore view. view = View.get_or_create(user=current_user, sketch=sketch, name=u'') view.query_string = form.query.data view.query_filter = json.dumps(query_filter, ensure_ascii=False) view.query_dsl = json.dumps(query_dsl, ensure_ascii=False) db_session.add(view) db_session.commit() # Add metadata for the query result. This is used by the UI to # render the event correctly and to display timing and hit count # information. tl_colors = {} tl_names = {} for timeline in sketch.timelines: tl_colors[timeline.searchindex.index_name] = timeline.color tl_names[timeline.searchindex.index_name] = timeline.name try: buckets = result[u'aggregations'][u'field_aggregation'][ u'buckets'] except KeyError: buckets = None es_total_count_unfiltered = 0 if buckets: for bucket in buckets: es_total_count_unfiltered += bucket[u'doc_count'] meta = { u'es_time': result[u'took'], u'es_total_count': result[u'hits'][u'total'], u'es_total_count_unfiltered': es_total_count_unfiltered, u'timeline_colors': tl_colors, u'timeline_names': tl_names, u'histogram': buckets } schema = {u'meta': meta, u'objects': result[u'hits'][u'hits']} return jsonify(schema) return abort(HTTP_STATUS_CODE_BAD_REQUEST)
def post(self, sketch_id): """Handles POST request to the resource. Handler for /api/v1/sketches/:sketch_id/explore/ Args: sketch_id: Integer primary key for a sketch database model Returns: JSON with list of matched events """ sketch = Sketch.query.get_with_acl(sketch_id) form = ExploreForm.build(request) if form.validate_on_submit(): query_filter = form.filter.data sketch_indices = [ t.searchindex.index_name for t in sketch.timelines] indices = query_filter.get(u'indices', sketch_indices) # Make sure that the indices in the filter are part of the sketch if set(indices) - set(sketch_indices): abort(HTTP_STATUS_CODE_BAD_REQUEST) # Make sure we have a query string or star filter if not form.query.data and not query_filter.get(u'star'): abort(HTTP_STATUS_CODE_BAD_REQUEST) result = self.datastore.search( sketch_id, form.query.data, query_filter, indices) # Get labels for each event that matches the sketch. # Remove all other labels. for event in result[u'hits'][u'hits']: event[u'selected'] = False event[u'_source'][u'label'] = [] try: for label in event[u'_source'][u'timesketch_label']: if sketch.id != label[u'sketch_id']: continue event[u'_source'][u'label'].append(label[u'name']) del event[u'_source'][u'timesketch_label'] except KeyError: pass # Update or create user state view. This is used in the UI to let # the user get back to the last state in the explore view. view = View.get_or_create( user=current_user, sketch=sketch, name=u'') view.query_string = form.query.data view.query_filter = json.dumps(query_filter) db_session.add(view) db_session.commit() # Add metadata for the query result. This is used by the UI to # render the event correctly and to display timing and hit count # information. tl_colors = {} tl_names = {} for timeline in sketch.timelines: tl_colors[timeline.searchindex.index_name] = timeline.color tl_names[timeline.searchindex.index_name] = timeline.name meta = { u'es_time': result[u'took'], u'es_total_count': result[u'hits'][u'total'], u'timeline_colors': tl_colors, u'timeline_names': tl_names } schema = { u'meta': meta, u'objects': result[u'hits'][u'hits'] } return jsonify(schema) return abort(HTTP_STATUS_CODE_BAD_REQUEST)