refactor filter code in sql backend
refactor filter TODO tasks in sqlalchemy backend Change-Id: Ia7f39b553bdbb861966b0f4d5fca1820af1c7082
This commit is contained in:
parent
ae630cf05c
commit
70a82cc515
@ -334,51 +334,36 @@ class Connection(base.Connection):
|
||||
if pagination:
|
||||
raise NotImplementedError('Pagination not implemented')
|
||||
|
||||
metaquery = metaquery or {}
|
||||
|
||||
def _apply_filters(query):
|
||||
# TODO(gordc) this should be merged with make_query_from_filter
|
||||
for column, value in [(models.Sample.resource_id, resource),
|
||||
(models.Sample.user_id, user),
|
||||
(models.Sample.project_id, project),
|
||||
(models.Sample.source_id, source)]:
|
||||
if value:
|
||||
query = query.filter(column == value)
|
||||
if metaquery:
|
||||
query = apply_metaquery_filter(session, query, metaquery)
|
||||
if start_timestamp:
|
||||
if start_timestamp_op == 'gt':
|
||||
query = query.filter(
|
||||
models.Sample.timestamp > start_timestamp)
|
||||
else:
|
||||
query = query.filter(
|
||||
models.Sample.timestamp >= start_timestamp)
|
||||
if end_timestamp:
|
||||
if end_timestamp_op == 'le':
|
||||
query = query.filter(
|
||||
models.Sample.timestamp <= end_timestamp)
|
||||
else:
|
||||
query = query.filter(
|
||||
models.Sample.timestamp < end_timestamp)
|
||||
return query
|
||||
s_filter = storage.SampleFilter(user=user,
|
||||
project=project,
|
||||
source=source,
|
||||
start=start_timestamp,
|
||||
start_timestamp_op=start_timestamp_op,
|
||||
end=end_timestamp,
|
||||
end_timestamp_op=end_timestamp_op,
|
||||
metaquery=metaquery,
|
||||
resource=resource)
|
||||
|
||||
session = self._engine_facade.get_session()
|
||||
# get list of resource_ids
|
||||
res_q = session.query(distinct(models.Sample.resource_id))
|
||||
res_q = _apply_filters(res_q)
|
||||
res_q = make_query_from_filter(session, res_q, s_filter,
|
||||
require_meter=False)
|
||||
|
||||
for res_id in res_q.all():
|
||||
# get latest Sample
|
||||
max_q = (session.query(models.Sample)
|
||||
.filter(models.Sample.resource_id == res_id[0]))
|
||||
max_q = _apply_filters(max_q)
|
||||
max_q = make_query_from_filter(session, max_q, s_filter,
|
||||
require_meter=False)
|
||||
max_q = max_q.order_by(models.Sample.timestamp.desc(),
|
||||
models.Sample.id.desc()).limit(1)
|
||||
|
||||
# get the min timestamp value.
|
||||
min_q = (session.query(models.Sample.timestamp)
|
||||
.filter(models.Sample.resource_id == res_id[0]))
|
||||
min_q = _apply_filters(min_q)
|
||||
min_q = make_query_from_filter(session, min_q, s_filter,
|
||||
require_meter=False)
|
||||
min_q = min_q.order_by(models.Sample.timestamp.asc()).limit(1)
|
||||
|
||||
sample = max_q.first()
|
||||
@ -408,19 +393,11 @@ class Connection(base.Connection):
|
||||
if pagination:
|
||||
raise NotImplementedError('Pagination not implemented')
|
||||
|
||||
metaquery = metaquery or {}
|
||||
|
||||
def _apply_filters(query):
|
||||
# TODO(gordc) this should be merged with make_query_from_filter
|
||||
for column, value in [(models.Sample.resource_id, resource),
|
||||
(models.Sample.user_id, user),
|
||||
(models.Sample.project_id, project),
|
||||
(models.Sample.source_id, source)]:
|
||||
if value:
|
||||
query = query.filter(column == value)
|
||||
if metaquery:
|
||||
query = apply_metaquery_filter(session, query, metaquery)
|
||||
return query
|
||||
s_filter = storage.SampleFilter(user=user,
|
||||
project=project,
|
||||
source=source,
|
||||
metaquery=metaquery,
|
||||
resource=resource)
|
||||
|
||||
session = self._engine_facade.get_session()
|
||||
|
||||
@ -441,7 +418,8 @@ class Connection(base.Connection):
|
||||
query_sample = (session.query(models.MeterSample).
|
||||
join(sample_subq, models.MeterSample.id ==
|
||||
sample_subq.c.id))
|
||||
query_sample = _apply_filters(query_sample)
|
||||
query_sample = make_query_from_filter(session, query_sample, s_filter,
|
||||
require_meter=False)
|
||||
|
||||
for sample in query_sample.all():
|
||||
yield api_models.Meter(
|
||||
|
Loading…
x
Reference in New Issue
Block a user