Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_query_kwargs():
from mock import MagicMock
mock_index = MagicMock()
mock_index.datasets.get_field_names = lambda: {u'product', u'lat', u'sat_path', 'type_id', u'time', u'lon',
u'orbit', u'instrument', u'sat_row', u'platform', 'metadata_type',
u'gsi', 'type', 'id'}
query = Query(index=mock_index, product='ls5_nbar_albers')
assert str(query)
assert query.product == 'ls5_nbar_albers'
assert query.search_terms['product'] == 'ls5_nbar_albers'
query = Query(index=mock_index, latitude=(-35, -36), longitude=(148, 149))
assert query.geopolygon
assert 'lat' in query.search_terms
assert 'lon' in query.search_terms
query = Query(index=mock_index, latitude=-35, longitude=148)
assert query.geopolygon
assert 'lat' in query.search_terms
assert 'lon' in query.search_terms
query = Query(index=mock_index, y=(-4174726, -4180011), x=(1515184, 1523263), crs='EPSG:3577')
assert query.geopolygon
assert 'lat' in query.search_terms
assert 'lon' in query.search_terms
query = Query(index=mock_index, y=-4174726, x=1515184, crs=CRS('EPSG:3577'))
assert query.geopolygon
assert 'lat' in query.search_terms
assert 'lon' in query.search_terms
query = Query(index=mock_index, time='2001')
assert 'time' in query.search
query = Query(index=mock_index, time=('2001', '2002'))
assert 'time' in query.search
with pytest.raises(ValueError):
Query(index=mock_index,
y=-4174726, coordinate_reference_system='WGS84',
x=1515184, crs='EPSG:3577')
with pytest.raises(LookupError):
Query(index=mock_index, y=-4174726, x=1515184, crs='EPSG:3577', made_up_key='NotReal')
with pytest.raises(LookupError):
query_group_by(group_by='magic')
gb = query_group_by('time')
assert isinstance(gb, GroupBy)
assert query_group_by(group_by=gb) is gb
assert 'lat' in query.search_terms
assert 'lon' in query.search_terms
query = Query(index=mock_index, time='2001')
assert 'time' in query.search
query = Query(index=mock_index, time=('2001', '2002'))
assert 'time' in query.search
with pytest.raises(ValueError):
Query(index=mock_index,
y=-4174726, coordinate_reference_system='WGS84',
x=1515184, crs='EPSG:3577')
with pytest.raises(LookupError):
Query(index=mock_index, y=-4174726, x=1515184, crs='EPSG:3577', made_up_key='NotReal')
with pytest.raises(LookupError):
query_group_by(group_by='magic')
gb = query_group_by('time')
assert isinstance(gb, GroupBy)
assert query_group_by(group_by=gb) is gb
def _get_datasets(index, geobox, product, time_):
query = datacube.api.query.Query(product=product, geopolygon=geobox.extent, time=time_)
datasets = index.datasets.search_eager(**query.search_terms)
datasets.sort(key=lambda d: d.center_time)
dataset_iter = iter(datasets)
to_load = []
for dataset in dataset_iter:
if dataset.extent.to_crs(geobox.crs).intersects(geobox.extent):
to_load.append(dataset)
break
else:
return None
geom = to_load[0].extent.to_crs(geobox.crs)
for dataset in dataset_iter:
if geom.contains(geobox.extent):
break
ds_extent = dataset.extent.to_crs(geobox.crs)
def find_periods_with_data(index, product_names, period_duration='1 day',
start_date='1985-01-01', end_date='2000-01-01'):
query = dict(y=(-3760000, -3820000), x=(1375400.0, 1480600.0), crs='EPSG:3577', time=(start_date, end_date))
valid_dates = set()
for product in product_names:
counts = index.datasets.count_product_through_time(period_duration, product=product,
**Query(**query).search_terms)
valid_dates.update(time_range for time_range, count in counts if count > 0)
for time_range in sorted(valid_dates):
yield time_range.begin, time_range.end
:param datacube.index.Index index: An optional `index` object, if checking of field names is desired.
:param str product: name of product
:param geopolygon: spatial bounds of the search
:type geopolygon: geometry.Geometry or None
:param xarray.Dataset like: spatio-temporal bounds of `like` are used for the search
:param search_terms:
* `measurements` - list of measurements to retrieve
* `latitude`, `lat`, `y`, `longitude`, `lon`, `long`, `x` - tuples (min, max) bounding spatial dimensions
* `crs` - spatial coordinate reference system to interpret the spatial bounds
* `group_by` - observation grouping method. One of `time`, `solar_day`. Default is `time`
"""
self.product = product
self.geopolygon = query_geopolygon(geopolygon=geopolygon, **search_terms)
if 'source_filter' in search_terms and search_terms['source_filter'] is not None:
self.source_filter = Query(**search_terms['source_filter'])
else:
self.source_filter = None
remaining_keys = set(search_terms.keys()) - set(SPATIAL_KEYS + CRS_KEYS + OTHER_KEYS)
if index:
unknown_keys = remaining_keys - set(index.datasets.get_field_names())
# TODO: What about keys source filters, and what if the keys don't match up with this product...
if unknown_keys:
raise LookupError('Unknown arguments: ', unknown_keys)
self.search = {}
for key in remaining_keys:
self.search.update(_values_to_search(**{key: search_terms[key]}))
if like:
assert self.geopolygon is None, "'like' with other spatial bounding parameters is not supported"
def dataset_count(index, **query):
return index.datasets.count(**Query(**query).search_terms)
def list_gqa_filtered_cells(index, gw, pix_th=1, cell_index=None, **indexers):
geobox = gw.grid_spec.tile_geobox(cell_index)
query = Query(index=index, **indexers)
observations = index.datasets.search_eager(**query.search_terms)
# filter now with pixel threshold value
datasets = {}
for dataset in observations:
if intersects(geobox.extent, dataset.extent.to_crs(gw.grid_spec.crs)):
if get_gqa(index, dataset.id) < pix_th:
datasets.setdefault(cell_index, {'datasets': [],
'_geobox': geobox})['datasets'].append(dataset)
return gw.group_into_cells(datasets, query_group_by(**indexers))
def query_polygon(**kw):
return Query(**kw).geopolygon