catalog.py 1.6 KB
Newer Older
Wei Shoulin's avatar
Wei Shoulin committed
1
import grpc
Wei Shoulin's avatar
bytes    
Wei Shoulin committed
2
import pickle
Wei Shoulin's avatar
timeit    
Wei Shoulin committed
3
import logging
Wei Shoulin's avatar
bytes    
Wei Shoulin committed
4
5
import io

Wei Shoulin's avatar
Wei Shoulin committed
6
from csst_dfs_commons.models import Result
Wei Shoulin's avatar
Wei Shoulin committed
7

Shoulin Wei's avatar
init  
Shoulin Wei committed
8
from csst_dfs_proto.common.ephem import ephem_pb2, ephem_pb2_grpc
Wei Shoulin's avatar
C9    
Wei Shoulin committed
9
from .service import get_grpc_channel
Wei Shoulin's avatar
ephem    
Wei Shoulin committed
10
from .utils import get_auth_headers
Shoulin Wei's avatar
init  
Shoulin Wei committed
11

Wei Shoulin's avatar
timeit    
Wei Shoulin committed
12
log = logging.getLogger('csst')
Shoulin Wei's avatar
init  
Shoulin Wei committed
13
14
class CatalogApi(object):
    def __init__(self):
Wei Shoulin's avatar
Wei Shoulin committed
15
16
        self.stub = None

Wei Shoulin's avatar
C9    
Wei Shoulin committed
17
    def catalog_query(self, **kwargs):
Shoulin Wei's avatar
init  
Shoulin Wei committed
18
        try:
Wei Shoulin's avatar
C9    
Wei Shoulin committed
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
            with get_grpc_channel() as c:
                self.stub = ephem_pb2_grpc.EphemSearchSrvStub(c)
                datas = io.BytesIO()
                totalCount = 0
                resps = self.stub.Search(ephem_pb2.SearchRequest(
                    conditions = { k:str(v) for k,v in kwargs.items() }
                ),metadata = get_auth_headers())
                for resp in resps:
                    if resp.success:
                        datas.write(resp.records)
                        totalCount = resp.totalCount
                    else:
                        return Result.error(message = str(resp.error.detail))
                datas.flush()
                records = pickle.loads(datas.getvalue())
Wei Shoulin's avatar
Wei Shoulin committed
34
35
36
37
38
39
40
                records, cols = records[0], records[1]
                columns = []
                for col in cols:
                    if col in columns:
                        columns.append("%s_1" % (col, ))
                    else:
                        columns.append(col)
Wei Shoulin's avatar
Wei Shoulin committed
41

Wei Shoulin's avatar
Wei Shoulin committed
42
                return Result.ok_data(data = records).append("totalCount", totalCount).append("columns", columns)
Wei Shoulin's avatar
Wei Shoulin committed
43
        except grpc.RpcError as e:
Wei Shoulin's avatar
Wei Shoulin committed
44
            return Result.error(message="%s:%s" % (e.code().value, e.details()))