1#!/usr/bin/env python3
2
3# SK 23/06/2023: Created
4
5import logging
6from chart.db import ts
7from chart.events.event import Event, include_event_check
8from chart.products.events.multitable_utils import process_ordering_sensing_time
9from chart.products.pus.packetdef import PacketDef
10from chart.db.model.table import TableInfo
11from chart.common.traits import is_listlike
12from chart.web.user import User
13
14DECODER_ID = 'ORBIT4ANT-EVENTS'
15TABLE = 'ORBIT4ANT'
16EVENT_CLASSNAME = 'ORBIT4ANT-EVENTS'
17
18logger = logging.getLogger()
19
20def find_events(sid,
21 start_time,
22 start_time_eq,
23 stop_time,
24 event_classes,
25 ordering,
26 from_to,
27 properties,
28 count,
29 single,
30 filtering,
31 multitable_extra_params,
32 user: User = None):
33
34 if from_to is not None:
35 page_start, page_stop = from_to
36
37 limit = 1 if single and start_time_eq is None else None
38
39 events = []
40 event_count = 0
41
42 # Reset ordering for sensing_time
43 order_clauses = process_ordering_sensing_time(ordering)
44
45 table_info = TableInfo(TABLE, sid=sid, fast_load=True)
46
47 if not single and count:
48 # just return count of events
49 event_count = ts.count(
50 table=table_info.storage_table,
51 field='SENSING_TIME',
52 method='ap',
53 sid=sid,
54 sensing_start=start_time,
55 sensing_stop=stop_time)
56
57 return event_count, events
58
59 fields = ('SENSING_TIME', 'PRODUCT', 'X', 'Y', 'Z', 'X_DOT', 'Y_DOT', 'Z_DOT')
60
61 for row in ts.select(sid=sid,
62 sensing_start=start_time,
63 sensing_stop=stop_time,
64 sensing_time=start_time_eq,
65 table=table_info.storage_table,
66 fields=fields,
67 ordering=order_clauses,
68 limit=limit):
69
70 sensing_time, product, x, y, z, x_dot, y_dot, z_dot = row
71 inst_properties = {
72 'SID_NUM': sid.sid_num,
73 'PRODUCT': product,
74 'X': x,
75 'Y': y,
76 'Z': z,
77 'X_DOT': x_dot,
78 'Y_DOT': y_dot,
79 'Z_DOT': z_dot
80 }
81
82 if not include_event_check(properties, inst_properties):
83 continue
84
85 event_count += 1
86
87 if not count and (from_to is None or (page_start <= event_count and event_count <= page_stop)):
88 events.append(Event(sid=sid,
89 event_classname=EVENT_CLASSNAME,
90 start_time=sensing_time,
91 instance_properties=inst_properties))
92 if single:
93 break
94
95 return event_count, events