utils.py 3.83 KB
Newer Older
Wei Shoulin's avatar
Wei Shoulin committed
1
from datetime import datetime
Wei Shoulin's avatar
Wei Shoulin committed
2
from astropy.table import Table
Wei Shoulin's avatar
Wei Shoulin committed
3
import time
Wei Shoulin's avatar
Wei Shoulin committed
4
import pandas as pd
Wei Shoulin's avatar
Wei Shoulin committed
5

Wei Shoulin's avatar
Wei Shoulin committed
6
7
from .delegate import Delegate

Wei Shoulin's avatar
Wei Shoulin committed
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def format_datetime(dt):
    return dt.strftime('%Y-%m-%d %H:%M:%S')

def format_date(dt):
    return dt.strftime('%Y-%m-%d')

def format_time_ms(float_time):
    local_time = time.localtime(float_time)
    data_head = time.strftime("%Y-%m-%d %H:%M:%S", local_time)
    data_secs = (float_time - int(float_time)) * 1000
    return "%s.%03d" % (data_head, data_secs)

def get_parameter(kwargs, key, default=None):
    """ Get a specified named value for this (calling) function

    The parameter is searched for in kwargs

    :param kwargs: Parameter dictionary
    :param key: Key e.g. 'max_workers'
    :param default: Default value
    :return: result
    """

    if kwargs is None:
        return default

    value = default
    if key in kwargs.keys():
        value = kwargs[key]
    return value
    
def to_int(s, default_value = 0):
    try:
        return int(s)
    except:
        return default_value

Wei Shoulin's avatar
Wei Shoulin committed
45
46
47
48
49
50
def to_float(s, default_value = 0):
    try:
        return float(s)
    except:
        return default_value
        
Wei Shoulin's avatar
Wei Shoulin committed
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
def singleton(cls):
    _instance = {}

    def inner():
        if cls not in _instance:
            _instance[cls] = cls()
        return _instance[cls]
    return inner

def revoke(cmd, desc=''):
    def decorator(func):
        class Wrapper:
            def __init__(self, cmd, desc, func) -> None:
                self.cmd = cmd
                self.func = func
            def __str__(self) -> str:
                return "cmd"
            def __call__(self, *args, **kw):
                return self.func(*args, **kw)
        return Wrapper(cmd, desc, func)
Wei Shoulin's avatar
Wei Shoulin committed
71
72
73
74
75
76
77
78
79
80
81
    return decorator

def fields_dtypes(rec):
    fields = tuple(rec.__dataclass_fields__.keys())
    dtypes = []
    for _, f in rec.__dataclass_fields__.items():
        if f.type == int:
            dtypes.append('i8')
        elif f.type == float:
            dtypes.append('f8')        
        elif f.type == str:
Wei Shoulin's avatar
Wei Shoulin committed
82
            dtypes.append('U11')
Wei Shoulin's avatar
Wei Shoulin committed
83
84
85
        elif f.type == list:
            dtypes.append('(12,)f8')       
        else:
Wei Shoulin's avatar
Wei Shoulin committed
86
            dtypes.append('U11')                
Wei Shoulin's avatar
Wei Shoulin committed
87
88
89
    dtypes = tuple(dtypes)
    return fields, dtypes

Wei Shoulin's avatar
Wei Shoulin committed
90
91
def tuple_fields_dtypes(rec: tuple):
    dtypes = []
Wei Shoulin's avatar
Wei Shoulin committed
92
93
    for f in rec:
        if type(f) == int:
Wei Shoulin's avatar
Wei Shoulin committed
94
            dtypes.append('i8')
Wei Shoulin's avatar
Wei Shoulin committed
95
        elif type(f) == float:
Wei Shoulin's avatar
s-v    
Wei Shoulin committed
96
            dtypes.append('f8')
Wei Shoulin's avatar
Wei Shoulin committed
97
        elif type(f) == str:
Wei Shoulin's avatar
Wei Shoulin committed
98
            dtypes.append('U11')
Wei Shoulin's avatar
Wei Shoulin committed
99
        elif type(f) == list:
Wei Shoulin's avatar
s-v    
Wei Shoulin committed
100
            dtypes.append('(12,)f8')
Wei Shoulin's avatar
Wei Shoulin committed
101
        else:
Wei Shoulin's avatar
Wei Shoulin committed
102
            dtypes.append('U11')
Wei Shoulin's avatar
Wei Shoulin committed
103
104
105
    dtypes = tuple(dtypes)
    return dtypes

Wei Shoulin's avatar
Wei Shoulin committed
106
107
108
109
110
111
112
113
114
# def to_table(query_result):
#     if not query_result.success or not query_result.data:
#         return Table()
#     fields = query_result['columns']
#     dtypes = tuple_fields_dtypes(query_result.data[0])
#     t = Table(names = fields, dtype = dtypes, rows = query_result.data)
#     t.meta['columns'] = fields
#     t.meta['total'] = query_result['totalCount']
#     return t
Wei Shoulin's avatar
Wei Shoulin committed
115

Wei Shoulin's avatar
Wei Shoulin committed
116
def to_table(query_result):
Wei Shoulin's avatar
Wei Shoulin committed
117
118
119
120
121
    if not query_result.success or not query_result.data:
        return Table()
    df = pd.DataFrame(data = query_result.data, columns = query_result['columns'])
    return Table.from_pandas(df, index = False)

Wei Shoulin's avatar
Wei Shoulin committed
122
def object_list_to_table(query_result):
Wei Shoulin's avatar
Wei Shoulin committed
123
124
125
126
127
128
129
130
131
    if not query_result.success or not query_result.data:
        return Table()
    fields, dtypes = fields_dtypes(query_result.data[0])
    t = Table(names = fields, dtype = dtypes)
    t.meta['comments'] = [str(query_result.data[0].__class__)]
    t.meta['total'] = query_result['totalCount']

    for rec in query_result.data:
        t.add_row(tuple([rec.__getattribute__(k) for k in fields]))
Wei Shoulin's avatar
Wei Shoulin committed
132
133
    return t

Wei Shoulin's avatar
Wei Shoulin committed
134
def get_nextId_by_prefix(prefix: str):
Wei Shoulin's avatar
Wei Shoulin committed
135
136
    pymodule = Delegate().load(sub_module = "common.utils")
    return getattr(pymodule, "get_nextId_by_prefix")(prefix)