Skip to content

Commit

Permalink
feat(bulk): implement bulk gets of multiple uuids
Browse files Browse the repository at this point in the history
  • Loading branch information
ProfOak committed Aug 14, 2018
1 parent b9c1dfa commit b09e07f
Show file tree
Hide file tree
Showing 8 changed files with 100 additions and 12 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,6 @@ docs/_build/
local_settings.py
settings.yaml
*.sq3

# swagger
swagger-codegen-cli-2.3.1.jar
2 changes: 2 additions & 0 deletions indexd/app.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import flask
from .bulk.blueprint import blueprint as indexd_bulk_blueprint
from .index.blueprint import blueprint as indexd_index_blueprint
from .alias.blueprint import blueprint as indexd_alias_blueprint
from .dos.blueprint import blueprint as indexd_dos_blueprint
Expand All @@ -14,6 +15,7 @@ def app_init(app, settings=None):
from .default_settings import settings
app.config.update(settings['config'])
app.auth = settings['auth']
app.register_blueprint(indexd_bulk_blueprint)
app.register_blueprint(indexd_index_blueprint)
app.register_blueprint(indexd_alias_blueprint)
app.register_blueprint(indexd_dos_blueprint)
Expand Down
Empty file added indexd/bulk/__init__.py
Empty file.
37 changes: 37 additions & 0 deletions indexd/bulk/blueprint.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"""Bulk operations for indexd"""
import json

import flask

from indexd.errors import UserError
from indexd.index.drivers.alchemy import IndexRecord

blueprint = flask.Blueprint('bulk', __name__)

blueprint.config = dict()
blueprint.index_driver = None


@blueprint.route('/bulk/documents', methods=['POST'])
def bulk_get_documents():
"""
Returns a list of records.
"""
ids = flask.request.json
if not ids:
raise UserError('No ids provided')
if not isinstance(ids, list):
raise UserError('ids is not a list')

with blueprint.index_driver.session as session:
query = session.query(IndexRecord)
query = query.filter(IndexRecord.did.in_(ids))

docs = [q.to_document_dict() for q in query]
return json.dumps(docs), 200


@blueprint.record
def get_config(setup_state):
config = setup_state.app.config['INDEX']
blueprint.index_driver = config['driver']
37 changes: 37 additions & 0 deletions openapis/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -657,6 +657,30 @@ paths:
type: string
tags:
- DOS
'/bulk/documents':
post:
tags:
- index
summary: Get a list of documents given a list of dids
description: Multiple status values can be provided with comma separated strings
operationId: getBulkIds
produces:
- application/json
parameters:
- in: body
name: body
description: List of dids to retrieve
required: true
schema:
$ref: '#/definitions/BulkInputInfo'
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/BulkOutputInfo'
'400':
description: Invalid status value
security: []
securityDefinitions:
cdis_auth:
type: oauth2
Expand Down Expand Up @@ -728,6 +752,15 @@ definitions:
type: string
hashes:
$ref: '#/definitions/HashInfo'
BulkInputInfo:
type: object
required:
- ids
properties:
ids:
type: array
items:
type: string
InputInfo:
type: object
required:
Expand Down Expand Up @@ -875,6 +908,10 @@ definitions:
type: string
pattern: >-
^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$
BulkOutputInfo:
type: array
items:
$ref: "#/definitions/OutputInfo"
OutputInfo:
type: object
properties:
Expand Down
13 changes: 2 additions & 11 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,9 @@
from setuptools import setup
from setuptools import setup, find_packages

setup(
name='indexd',
version='0.1',
packages=[
'indexd',
'indexd.auth',
'indexd.auth.drivers',
'indexd.index',
'indexd.index.drivers',
'indexd.alias',
'indexd.alias.drivers',
'indexd.dos',
],
packages=find_packages(),
package_data={
'index': [
'schemas/*',
Expand Down
2 changes: 2 additions & 0 deletions tests/test_blueprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import tests.util as util

from indexd.bulk.blueprint import blueprint as indexd_bulk_blueprint
from indexd.index.blueprint import blueprint as indexd_index_blueprint
from indexd.alias.blueprint import blueprint as indexd_alias_blueprint

Expand Down Expand Up @@ -32,6 +33,7 @@ def test_flask_blueprint():
app.config['ALIAS'] = ALIAS_CONFIG
app.config['DIST'] = []

app.register_blueprint(indexd_bulk_blueprint)
app.register_blueprint(indexd_index_blueprint)
app.register_blueprint(indexd_alias_blueprint)

Expand Down
18 changes: 17 additions & 1 deletion tests/test_client.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import json

import pytest
from swagger_client.rest import ApiException

from indexd.index.blueprint import ACCEPTABLE_HASHES
from swagger_client.rest import ApiException


def get_doc(
has_metadata=True, has_baseid=False,
Expand Down Expand Up @@ -682,3 +683,18 @@ def test_update_without_changing_fields(swg_index_client):
third_doc = swg_index_client.get_entry(result.did)
# Only `version` changed.
assert second_doc.version != third_doc.version

def test_bulk_get_documents(swg_index_client):

# just make a bunch of entries in indexd
dids = [
swg_index_client.add_entry(get_doc(has_baseid=True)).did
for _ in range(20)
]

# do a bulk query for them all
docs = swg_index_client.get_bulk_ids(dids)

# compare that they are the same by did
for doc in docs:
assert doc['did'] in dids

0 comments on commit b09e07f

Please sign in to comment.