Skip to content

Commit

Permalink
feat(list-ids): support list with id params (#127)
Browse files Browse the repository at this point in the history
* feat(list-ids): support list with id params

* feat(list): do not paginate for ids
  • Loading branch information
philloooo authored May 11, 2018
1 parent 0c61af4 commit 53071b9
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 34 deletions.
20 changes: 16 additions & 4 deletions indexd/index/blueprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,27 +50,37 @@ def get_index():
Returns a list of records.
'''
limit = flask.request.args.get('limit')
try: limit = 100 if limit is None else int(limit)
start = flask.request.args.get('start')

ids = flask.request.args.get('ids')
if ids:
ids = ids.split(',')
if start is not None or limit is not None:
raise UserError(
'pagination is not supported when ids is provided')
try:
limit = 100 if limit is None else int(limit)
except ValueError as err:
raise UserError('limit must be an integer')

if limit <= 0 or limit > 1024:
raise UserError('limit must be between 1 and 1024')

size = flask.request.args.get('size')
try: size = size if size is None else int(size)
try:
size = size if size is None else int(size)
except ValueError as err:
raise UserError('size must be an integer')

if size is not None and size < 0:
raise UserError('size must be > 0')

start = flask.request.args.get('start')

urls = flask.request.args.getlist('url')

acl = flask.request.args.getlist('acl')


file_name = flask.request.args.get('file_name')

version = flask.request.args.get('version')
Expand All @@ -87,7 +97,7 @@ def get_index():
if limit < 0 or limit > 1024:
raise UserError('limit must be between 0 and 1024')

ids = blueprint.index_driver.ids(
records = blueprint.index_driver.ids(
start=start,
limit=limit,
size=size,
Expand All @@ -96,11 +106,13 @@ def get_index():
urls=urls,
acl=acl,
hashes=hashes,
ids=ids,
metadata=metadata,
)

base = {
'ids': ids,
'records': records,
'limit': limit,
'start': start,
'size': size,
Expand Down
18 changes: 9 additions & 9 deletions indexd/index/driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@ class IndexDriverABC(SQLAlchemyDriverBase):
def __init__(self, conn, **config):
super(IndexDriverABC, self).__init__(conn, **config)


__metaclass__ = abc.ABCMeta

@abc.abstractmethod
def ids(self,
limit=100,
start=None,
size=None,
urls=None,
hashes=None,
file_name=None,
version=None,
metadata=None):
limit=100,
start=None,
size=None,
urls=None,
hashes=None,
file_name=None,
version=None,
metadata=None,
ids=None):
'''
Returns a list of records stored by the backend.
'''
Expand Down
12 changes: 9 additions & 3 deletions indexd/index/drivers/alchemy.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,8 @@ def ids(self,
hashes=None,
file_name=None,
version=None,
metadata=None):
metadata=None,
ids=None):
"""
Returns list of records stored by the backend.
"""
Expand Down Expand Up @@ -346,9 +347,14 @@ def ids(self,
query = query.filter(IndexRecord.did.in_(sub.subquery()))

query = query.order_by(IndexRecord.did)
query = query.limit(limit)

return [i.did for i in query]
if ids:
query = query.filter(IndexRecord.did.in_(ids))
else:
# only apply limit when ids is not provided
query = query.limit(limit)

return [i.to_document_dict() for i in query]

def hashes_to_urls(self, size, hashes, start=0, limit=100):
"""
Expand Down
38 changes: 37 additions & 1 deletion openapis/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,41 @@ paths:
parameters:
- name: metadata
in: query
description: metadata associated with the entry
description: metadata in format key:value
required: false
type: string
- name: size
in: query
description: object size
required: false
type: integer
- name: hash
in: query
description: hash in format hash_type:hash_value
required: false
type: string
- name: ids
in: query
description: |
comma delimited ids, when provided,
pagination params(start, limit) are not supported
required: false
type: string
- name: urls
in: query
description: comma delimited urls
required: false
type: string
- name: start
in: query
description: start did
required: false
type: string
- name: limit
in: query
description: number of records to return for this page, default to 100
required: false
type: integer
produces:
- application/json
responses:
Expand All @@ -112,6 +144,10 @@ paths:
type: array
items:
$ref: '#/definitions/DID'
records:
type: array
items:
$ref: "#/definitions/OutputInfo"
size:
type: integer
format: int64
Expand Down
39 changes: 22 additions & 17 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,32 +29,37 @@ def get_doc(

def test_index_list(swg_index_client):
r = swg_index_client.list_entries()
assert r.ids == []
assert r.records == []


def test_index_list_with_params(client, user):
def test_index_list_with_params(swg_index_client):
data = get_doc()

r_1 = client.post(
'/index/',
data=json.dumps(data),
headers=user)
r_1 = swg_index_client.add_entry(data)
data['metadata'] = {'project_id': 'other-project'}

r_2 = client.post(
'/index/',
data=json.dumps(data),
headers=user)
r_2 = swg_index_client.add_entry(data)

r = client.get('/index/?metadata=project_id%3Abpa-UChicago')
assert r_1.json['did'] in r.json['ids']
r = swg_index_client.list_entries(metadata='project_id:bpa-UChicago')
ids = [record.did for record in r.records]
assert r_1.did in ids

r = client.get('/index/?metadata=project_id%3Aother-project')
assert r_2.json['did'] in r.json['ids']
r = swg_index_client.list_entries(metadata='project_id:other-project')
ids = [record.did for record in r.records]
assert r_2.did in ids

r = client.get('/index/?hashes=md5%3A8b9942cf415384b27cadf1f4d2d682e5')
assert r_1.json['did'] in r.json['ids']
assert r_2.json['did'] in r.json['ids']
r = swg_index_client.list_entries(
hash='md5:8b9942cf415384b27cadf1f4d2d682e5')
ids = [record.did for record in r.records]
assert r_1.did in ids
assert r_2.did in ids

r = swg_index_client.list_entries(
ids=','.join(ids))

ids = [record.did for record in r.records]
assert r_1.did in ids
assert r_2.did in ids


def test_urls_metadata(swg_index_client):
Expand Down

0 comments on commit 53071b9

Please sign in to comment.