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 = 'PREDICTED-ORBIT-EVENTS'
15TABLE = 'PREDICTED_ORBIT'
16EVENT_CLASSNAME = 'PREDICTED-ORBIT-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
60    fields = ('SENSING_TIME', 'PRODUCT', 'X', 'Y', 'Z', 'VX', 'VY', 'VZ')
61
62    for row in ts.select(sid=sid,
63                         sensing_start=start_time,
64                         sensing_stop=stop_time,
65                         sensing_time=start_time_eq,
66                         table=table_info.storage_table,
67                         fields=fields,
68                         ordering=order_clauses,
69                         limit=limit):
70        sensing_time, product, x, y, z, vx, vy, vz = row
71        inst_properties = {
72            'SID_NUM': sid.sid_num,
73            'PRODUCT': product,
74            'X': x,
75            'Y': y,
76            'Z': z,
77            'VX': vx,
78            'VY': vy,
79            'VZ': vz
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