blob: f63fa51b1312e11ff4cbf300b3adc00fccd69223 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from elasticsearch import Elasticsearch, TransportError
from elasticsearch_dsl import DocType, String, Boolean, Date, Float, Search
from elasticsearch_dsl.query import MultiMatch, Match, Q
from elasticsearch import Elasticsearch, TransportError
from elasticsearch_dsl.connections import connections
from werkzeug.datastructures import ImmutableMultiDict, MultiDict
from flask import jsonify, Markup
from distill import app, es
import datetime
class UserAle (object):
"""
Main method of entry to perform segmentation and integration of STOUT's master
answer table (if STOUT is enabled). Advanced and basic analytics is performed in the
distill.algorithms.stats and distill.algorithms.graphs module.
"""
@staticmethod
def segment (app, app_type=None, params=''):
"""
Just support match all for now.
"""
q = params.get ("q") if params.get ("q") else {}
fields = params.get ("fields") if params.get ("fields") else []
size = params.get ("size") if params.get ("size") else 10
scroll = params.get ("scroll") if params.get ("scroll") else False
fl = params.get ("fl") if params.get ("fl") else []
# filters = params.get ("filter") if params.get ("filter") else {}
# 'q': args.get('q', '{}'),
# 'fields': args.get('fl', '{}'),
# 'size': args.get ('size', 100),
# 'scroll': args.get ('scroll', False),
# 'filters': request_args.getlist ('fq')
query = {}
query ['size'] = size
if q:
res = q.split(":")
key = res [0]
val = res [1]
query ['query'] = {"match" : { key : val } }
else:
query ['query'] = {"match_all" : {}}
if len (fields) > 0:
ex = {
"include" : fields.split(",")
}
query ['_source'] = ex
response = es.search (index=app, doc_type=app_type, body=query)
return jsonify (response)
@staticmethod
def search (app,
app_type=None,
filters=list (),
size=100,
include="*",
scroll=None,
sort_field=None):
"""
Perform a search query.
:param app: [string] application id (e.g. "xdata_v3")
:param app_type: [string] name of the application type. If None all application types are searched.
:param filters: [list of strings] list of filters for a query.
:param size: [int] maximum number of hits that should be returned
:param sort_field: [string] sorting field. Currently supported fields: "timestamp", "date"
:return: [dict] dictionary with processed results. If STOUT is enabled, STOUT data will be merged with final result.
"""
# Need some query builder...
log_result = es.search (index=app, doc_type=app_type, body=query, fields=filters, size=size)
stout_result = Stout.getSessions ()
data = merged_results (log_result, stout_result)
return data
@staticmethod
def denoise (app, app_type='parsed', save=False):
"""
"""
pass
"""
Combine a list of dictionaries together to form one complete dictionary
"""
def merge_dicts (lst):
dall = {}
for d in lst:
dall.update (d)
return dall
"""
Get query parameters from the request and preprocess them.
:param [dict-like structure] Any structure supporting get calls
:result [dict] Parsed parameters
"""
def parse_query_parameters (indx, app_type=None, request_args = {}):
args = {key: value[0] for (key, value) in dict (request_args).iteritems ()}
# print "args = ", args
# Parse out simple filter queries
filters = []
for filter in get_all_fields (indx, app_type):
if filter in args:
filters.append((filter, args[filter]))
return {
'q': args.get('q', '{}'),
'fields': args.get('fl', []),
'size': args.get ('size', 100),
'scroll': args.get ('scroll', False),
'filters': request_args.getlist ('fq')
}