level2.py 7.63 KB
Newer Older
Wei Shoulin's avatar
Wei Shoulin committed
1
import os
Wei Shoulin's avatar
pkl    
Wei Shoulin committed
2
import pickle
Wei Shoulin's avatar
Wei Shoulin committed
3
4
from typing import Optional, Tuple, Literal, Union, IO
from .common import request, Result, utils
Wei Shoulin's avatar
Wei Shoulin committed
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

DateTimeTuple = Tuple[str, str]

def find(
        project_id: Optional[str] = None,
        obs_id: Optional[str] = None,
        module_id: Literal['MSC', 'IFS', 'MCI', 'HSTDM', 'CPIC'] = 'MSC',
        detector_no: Optional[str] = None,
        data_type: Optional[str] = None,
        filter: Optional[str] = None,
        obs_time: Optional[DateTimeTuple] = None,
        create_time: Optional[DateTimeTuple] = None,
        qc2_status: Optional[int] = None,
        prc_status: Optional[int] = None,
        file_name: Optional[str] = None,
        object_name: Optional[str] = None,
        page: int = 1,
        limit: int = 0) -> Result:
    """
Wei Shoulin's avatar
Wei Shoulin committed
24
    根据给定的参数搜索2级数据文件记录
Wei Shoulin's avatar
Wei Shoulin committed
25
26
27
28
29
30
    
    Args:
        project_id (Optional[str], optional): 项目ID. Defaults to None.
        obs_id (Optional[str], optional): 观测ID. Defaults to None.
        module_id (Optional[str], optional): 模块ID,如'MSC', 'IFS'. Defaults to None.
        detector_no (Optional[str], optional): 探测器编号. Defaults to None.
Wei Shoulin's avatar
Wei Shoulin committed
31
        data_type (Optional[str], optional): 文件类型,如'csst-msc-l2-mbi-cat'. Defaults to None.
Wei Shoulin's avatar
Wei Shoulin committed
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
        filter (Optional[str], optional): 滤光片. Defaults to None.
        obs_time (Optional[DateTimeTuple], optional): 观测时间范围. Defaults to None.
        create_time (Optional[DateTimeTuple], optional): 创建时间范围. Defaults to None.
        qc2_status (Optional[int], optional): QC0状态. Defaults to None.
        prc_status (Optional[int], optional): 处理状态. Defaults to None.
        file_name (Optional[str], optional): 文件名. Defaults to None.
        object_name (Optional[str], optional): 天体名称. Defaults to None.
        page (int, optional): 页码. Defaults to 1.
        limit (int, optional): 每页数量. Defaults to 0.
    
    Returns:
        Result: 搜索结果对象.
    
    """

    params = {
        'project_id': project_id,
        'obs_id': obs_id,
        'module_id': module_id,
        'detector_no': detector_no,
        'data_type': data_type,
        'filter': filter,
        'qc2_status': qc2_status,
        'prc_status': prc_status,
        'file_name': file_name,
        'object_name': object_name,
        'obs_time_start': None,
        'obs_time_end': None,
        'create_time_start': None,
        'create_time_end': None,
        'page': page,
        'limit': limit,
    }
    
    if obs_time is not None:
        params['obs_time_start'], params['obs_time_end'] = obs_time
Wei Shoulin's avatar
Wei Shoulin committed
68
        utils.is_valid_datetime_format(params['obs_time_start']) or not utils.is_valid_datetime_format(params['obs_time_end'])
Wei Shoulin's avatar
Wei Shoulin committed
69
70
    if create_time is not None:
        params['create_time_start'], params['create_time_end'] = create_time
Wei Shoulin's avatar
Wei Shoulin committed
71
        utils.is_valid_datetime_format(params['create_time_start']) or utils.is_valid_datetime_format(params['create_time_end'])
Wei Shoulin's avatar
Wei Shoulin committed
72
73
74
75
76
    
    return request.post("/api/level2", params)

def find_by_level2_id(level2_id: str) -> Result:
    """
Wei Shoulin's avatar
Wei Shoulin committed
77
    通过 level2 的 ID 查询2级数据
Wei Shoulin's avatar
Wei Shoulin committed
78
79
    
    Args:
Wei Shoulin's avatar
Wei Shoulin committed
80
        level2_id (str): 2级数据的ID
Wei Shoulin's avatar
Wei Shoulin committed
81
82
    
    Returns:
Wei Shoulin's avatar
Wei Shoulin committed
83
        Result: 查询结果
Wei Shoulin's avatar
Wei Shoulin committed
84
85
86
87
88
89
90
91
92
93
    
    """
    return request.get(f"/api/level2/{level2_id}")

def update_qc2_status(level2_id: str, data_type: str, qc2_status: int) -> Result:
    """
    更新2级数据的QC0状态
    
    Args:
        level2_id (str): 2级数据文件的ID
Wei Shoulin's avatar
Wei Shoulin committed
94
        data_type (str): 数据类型,如'csst-msc-l2-mbi-cat'
Wei Shoulin's avatar
Wei Shoulin committed
95
96
97
98
99
100
101
102
103
        qc2_status (int): QC0状态
    
    Returns:
        Result: 更新结果
    """
    return request.put(f"/api/level2/qc2_status/{level2_id}", {'data_type': data_type, 'qc2_status': qc2_status})

def update_prc_status(level2_id: str, data_type: str, prc_status: int) -> Result:
    """
Wei Shoulin's avatar
Wei Shoulin committed
104
    更新2级数据的处理状态
Wei Shoulin's avatar
Wei Shoulin committed
105
106
    
    Args:
Wei Shoulin's avatar
Wei Shoulin committed
107
108
109
        level2_id (str): 2级数据文件的ID
        data_type (str): 数据类型,如'csst-msc-l2-mbi-cat'
        prc_status (int): 处理状态
Wei Shoulin's avatar
Wei Shoulin committed
110
111
    
    Returns:
Wei Shoulin's avatar
Wei Shoulin committed
112
        Result: 操作结果
Wei Shoulin's avatar
Wei Shoulin committed
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
    """
    return request.put(f"/api/level2/prc_status/{level2_id}", {'data_type': data_type, 'prc_status': prc_status})

def update_qc2_status_by_file_name(file_name: str, qc2_status: int) -> Result:
    """
    更新2级数据的QC0状态
    
    Args:
        file_name (str): 2级数据文件名
        qc2_status (int): QC0状态
    
    Returns:
        Result: 更新结果
    """
    return request.put(f"/api/level2/qc2_status/file/{file_name}", {'qc2_status': qc2_status})

def update_prc_status_by_file_name(file_name: str, prc_status: int) -> Result:
    """
Wei Shoulin's avatar
Wei Shoulin committed
131
    更新2级数据的处理状态
Wei Shoulin's avatar
Wei Shoulin committed
132
133
    
    Args:
Wei Shoulin's avatar
Wei Shoulin committed
134
135
        file_name (str): 2级数据文件名
        prc_status (int): 处理状态
Wei Shoulin's avatar
Wei Shoulin committed
136
137
    
    Returns:
Wei Shoulin's avatar
Wei Shoulin committed
138
        Result: 操作结果
Wei Shoulin's avatar
Wei Shoulin committed
139
140
141
    """
    return request.put(f"/api/level2/prc_status/file/{file_name}", {'prc_status': prc_status})

Wei Shoulin's avatar
Wei Shoulin committed
142
def write(local_file: Union[IO | str],
Wei Shoulin's avatar
Wei Shoulin committed
143
144
145
146
147
148
        module_id: Literal['MSC', 'IFS', 'MCI', 'HSTDM', 'CPIC'],
        level0_id: Optional[str | None],
        level1_id: Optional[str | None],
        level2_id: Optional[str | None],
        brick_id: Optional[int | None],
        data_type: str,
Wei Shoulin's avatar
Wei Shoulin committed
149
        file_name: str,
Wei Shoulin's avatar
Wei Shoulin committed
150
151
152
153
154
        pipeline_id: str,
        build: int,
        version: str,
        **extra_kwargs) -> Result:
    """
Wei Shoulin's avatar
Wei Shoulin committed
155
    将本地的2级数据文件写入到DFS中
Wei Shoulin's avatar
Wei Shoulin committed
156
157
    
    Args:
Wei Shoulin's avatar
Wei Shoulin committed
158
159
160
161
162
163
164
165
166
167
168
169
        local_file (Union[IO | str]): 文件路径 或 文件对象
        module_id ['MSC', 'IFS', 'MCI', 'HSTDM', 'CPIC']其中一个,代表: 模块ID
        level0_id (Optional[str | None]): 0级数据的ID默认为 None
        level1_id (Optional[str | None]): 1级数据的ID默认为 None
        level2_id (Optional[str | None]): 2级数据的ID默认为 None
        brick_id (Optional[int | None]): 天区的ID默认为 None
        data_type (str): 数据类型,如'csst-msc-l2-mbi-cat'
        file_name (str): 2级数据文件名
        pipeline_id (str): 管线ID
        pmapname (str): CCDS pmap名称
        build (int): 构建号
        **kwargs: 额外的关键字参数,这些参数将传递给DFS
Wei Shoulin's avatar
Wei Shoulin committed
170
171
    
    Returns:
Wei Shoulin's avatar
Wei Shoulin committed
172
        Result: 操作的结果对象,包含操作是否成功以及相关的错误信息,成功返回data为2级数据对象
Wei Shoulin's avatar
Wei Shoulin committed
173
174
    
    """
Wei Shoulin's avatar
Wei Shoulin committed
175
176
177
    if utils.is_valid_filename(file_name):
        raise ValueError(f"Incorrect file name [{file_name}], should be *.*")    
    params = {'module_id': module_id, 'level0_id': level0_id, 'level1_id': level1_id, 'level2_id': level2_id, 'brick_id': brick_id, 'file_name': file_name, 'data_type': data_type, 'pipeline_id': pipeline_id, 'build': build, 'version': version}
Wei Shoulin's avatar
Wei Shoulin committed
178
    params.update(extra_kwargs)    
Wei Shoulin's avatar
Wei Shoulin committed
179
180
181
182
183
    if isinstance(local_file, str):
        if not os.path.exists(local_file):
            raise FileNotFoundError(local_file)        
        return request.post_file("/api/level2/file", local_file, params)
    return request.post_bytesio("/api/level2/file", local_file, params)
Wei Shoulin's avatar
Wei Shoulin committed
184
185

def catalog_query(sql: str, limit: int = 0) -> Result:
Wei Shoulin's avatar
Wei Shoulin committed
186
187
188
189
190
191
192
193
194
195
196
197
    """
    根据给定的SQL查询语句和限制条件,从数据库中查询2级科学数据并返回查询结果。

    Args:
        sql (str): 要执行的SQL查询语句。
        limit (int, optional): 查询结果的最大数量。默认为0,表示不限制数量。

    Returns:
        Result: 包含查询结果的Result对象,data为pd.DataFrame对象。

    """

Wei Shoulin's avatar
pkl    
Wei Shoulin committed
198
199
200
201
202
203
    datas = request.post("/api/level2/catalog/query", {'sql': sql, 'limit': limit})
    if datas and isinstance(datas, Result):
        return datas
    records = pickle.loads(datas._content)
    df, total_count = records['records'], records['totalCount']
    return Result.ok_data(data = df).append("totalCount", total_count)