예제 #1
0
def convert(query, query_type='sql'):
    if not query:
        raise SqlFormatError(message='sql or fs not provided')
    if query_type == 'fs' and not '&' in query:
        raise SqlFormatError(message='sql or fs not provided')

    logging.info('Converting Query: ' + query)

    endpoint = 'sql2SQL'
    if query_type == 'fs':
        endpoint = 'fs2SQL'

    result = endpoint + query

    try:
        config = {'uri': '/convert/' + result, 'method': 'GET'}
        response = request_to_microservice(config)
    except Exception as error:
        raise error

    if response.get('errors'):
        errors = response.get('errors')
        raise SqlFormatError(message=errors[0].get('detail'))

    query = QueryResponder().deserialize(response)
    s_query = query.get('attributes', {}).get('query')
    json_sql = query.get('attributes', {}).get('jsonSql')

    return s_query, json_sql
예제 #2
0
def register_dataset():
    """Register GEE Dataset Endpoint"""
    logging.info('Registering new GEE Dataset')

    # Build query
    table_name = request.get_json().get('connector').get('table_name')
    table_type = QueryService.get_type(table_name=table_name)

    sql = '?sql=SELECT * FROM \"' + table_name + '\" LIMIT 1'

    if table_type is 'raster':
        sql = '?sql=SELECT ST_METADATA() from \"' + table_name + '\"'

    # Convert query
    query, json_sql = QueryService.convert(sql, query_type='sql')

    try:
        response = EarthEngineService.execute_query(query)
        status = 1
    except GEEQueryError as error:
        logging.error(error.message)
        status = 2

    config = {
        'uri': '/dataset/' + request.get_json().get('connector').get('id'),
        'method': 'PATCH',
        'body': {
            'status': status
        }
    }
    response = request_to_microservice(config)
    return jsonify(response), 200
def register_dataset():
    """Register GEE Dataset Endpoint"""
    logging.info('Registering new GEE Dataset')

    table_name = request.get_json().get('connector').get('table_name')
    sql = '?sql=SELECT * FROM \"' + table_name + '\" LIMIT 1'

    # Convert query
    json_sql = QueryService.convert(sql, query_type='sql')

    try:
        response = EarthEngineService.execute_query(json_sql).metadata
        status = 1
    except GEEQueryError as e:
        logging.error('[ROUTER] /rest-datasets/gee - GEE Query error in GEE query execution: ' + e.message)
        status = 2
    except Exception as e:
        logging.error('[ROUTER] /rest-datasets/gee - Generic error in GEE query execution: ' + str(e))
        status = 2

    config = {
        'uri': '/dataset/' + request.get_json().get('connector').get('id'),
        'method': 'PATCH',
        'body': {'status': status}
    }
    response = request_to_microservice(config)
    return jsonify(data=serialize_fields(response, table_name)), 200
예제 #4
0
    def execute(config):
        response = request_to_microservice(config)
        if not response or response.get('errors'):
            raise LayerNotFound(message='Layer not found')

        layer = response.get('data', None).get('attributes', None)
        return layer
def convert(query, query_type='sql'):
    if not query:
        raise SqlFormatError(message='sql or fs not provided')
    if query_type == 'fs' and not '&' in query:
        raise SqlFormatError(message='sql or fs not provided')

    logging.info('Converting Query: ' + query)

    endpoint = 'sql2SQL'
    if query_type == 'fs':
        endpoint = 'fs2SQL'

    result = endpoint + query
    logging.info(f'[QUERY SERVICE - convert]: {result}')

    try:
        config = {'uri': '/convert/' + result, 'method': 'GET'}
        response = request_to_microservice(config)
        return response
    except Exception as error:
        raise error

    if response.get('errors'):
        errors = response.get('errors')
        raise SqlFormatError(message=errors[0].get('detail'))
예제 #6
0
def callback_to_dataset(body):
    config = {
        'uri': '/dataset/' + request.get_json().get('connector').get('id'),
        'method': 'PATCH',
        'body': body
    }
    return request_to_microservice(config)
예제 #7
0
def get_geostore(geostore_id, format='esri'):
    """ make request to geostore microservice for user given geostore ID """

    config = {
        'uri': '/geostore/{}?format={}'.format(geostore_id, format),
        'method': 'GET',
    }

    return request_to_microservice(config)
예제 #8
0
 def execute(config):
     try:
         response = request_to_microservice(config)
         if not response or response.get('errors'):
             raise GeostoreNotFound
         geostore = response.get('data', None).get('attributes', None)
         geojson = geostore.get('geojson', None)
         bbox = geostore.get('bbox', None)
     except Exception as e:
         raise GeostoreNotFound(message=str(e))
     return geojson, bbox
예제 #9
0
    def execute(config):
        try:
            response = request_to_microservice(config)
            if not response or response.get('errors'):
                raise GeostoreNotFound
            geostore = response.get('data', None).get('attributes', None)
            geojson = geostore.get('geojson', None).get('features', None)[0]

        except Exception as err:
            return error(status=502, detail=f'{err}')
        return geojson
def get_geojson(geostore):

    try:
        config = {'uri': f'/geostore/{geostore}', 'method': 'GET'}
        response = request_to_microservice(config)
        return response.get('data').get('attributes').get('geojson')
    except Exception as error:
        raise error

    if response.get('errors'):
        errors = response.get('errors')
        raise SqlFormatError(message=errors[0].get('detail'))
예제 #11
0
def get_fields(dataset):
    logging.info('[QueryService] Getting fields for dataset')
    try:
        request_options = {
            'uri': '/fields/' + dataset,
            'method': 'GET'
        }
        response = request_to_microservice(request_options)
        if not response or response.get('errors'):
            raise FieldsGenericError(message='Error obtaining fields')
    except Exception as error:
        raise FieldsGenericError(message="Error obtaining fields")
    return response
예제 #12
0
 def execute(config):
     try:
         response = request_to_microservice(config)
     except Exception as e:
         raise Exception(str(e))
     if response.get('errors'):
         error = response.get('errors')[0]
         if error.get('status') == 404:
             raise GeostoreNotFound(message='')
         else:
             raise Exception(error.get('detail'))
     geostore = response.get('data', None).get('attributes', None)
     geojson = geostore.get('geojson', None)
     area_ha = geostore.get('areaHa', None)
     return geojson, area_ha
예제 #13
0
def get_geostore(geostore):
    logging.info('[QueryService] Getting geostore')
    try:
        request_options = {
            'uri': '/geostore/' + geostore,
            'method': 'GET'
        }
        response = request_to_microservice(request_options)
        if not response or response.get('errors'):
            raise GeostoreNotFoundError(message='Error obtaining geostore')
        logging.debug('GEOSTORE RESPONSE: ' + str(response))
    except Exception as error:
        logging.error(str(error))
        raise GeostoreNotFoundError(message='Error obtaining geostore')
    return response
예제 #14
0
    def convert(query):
        logging.info('Converting Query: ' + query)
        try:
            config = {'uri': '/convert/sql2SQL?sql=' + query, 'method': 'GET'}
            response = request_to_microservice(config)
        except Exception as error:
            raise error

        if response.get('errors'):
            errors = response.get('errors')
            raise SqlFormatError(message=errors[0].get('detail'))

        query = response.get('data', None)
        s_query = query.get('attributes', {}).get('query')
        json_sql = query.get('attributes', {}).get('jsonSql')
        return s_query, json_sql
예제 #15
0
def getDataset(indicator, scenario, temporal_res):
    logging.info('[NEXGDDP-ROUTER] Get info of indicator')
    datasets = request_to_microservice({
        'uri':
        '/dataset?includes=layer&tableName=' + indicator + '/' + scenario +
        '_' + temporal_res + '&env=' + request.args.get("env", 'production'),
        'method':
        'GET'
    })
    if datasets.get('data') and len(datasets.get('data')) > 0:
        return jsonify({"data": datasets.get('data')[0]}), 200
    return jsonify(
        {"errors": [{
            "status": 404,
            "detail": "Dataset doesn't exist"
        }]}), 404
예제 #16
0
 def execute(config):
     response = request_to_microservice(config)
     if not response or response.get('errors'):
         raise DatasetNotFound(message='Dataset not found')
     dataset = response.get('data', None).get('attributes', None)
     return dataset