Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Open sidebar
ensembl-web
ensembl-client
Commits
e0963c5b
Unverified
Commit
e0963c5b
authored
May 04, 2022
by
Andrey Azov
Committed by
GitHub
May 04, 2022
Browse files
Use updated endpoint for blast form submission (#739)
parent
d7f4a8fa
Pipeline
#273100
failed with stages
in 12 minutes and 18 seconds
Changes
6
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
67 additions
and
39 deletions
+67
-39
src/content/app/tools/blast/components/blast-job-submit/BlastJobSubmit.test.tsx
...blast/components/blast-job-submit/BlastJobSubmit.test.tsx
+4
-1
src/content/app/tools/blast/components/blast-job-submit/BlastJobSubmit.tsx
...ools/blast/components/blast-job-submit/BlastJobSubmit.tsx
+8
-5
src/content/app/tools/blast/state/blast-api/blastApiSlice.ts
src/content/app/tools/blast/state/blast-api/blastApiSlice.ts
+30
-16
src/content/app/tools/blast/state/blast-results/blastResultsSlice.ts
.../app/tools/blast/state/blast-results/blastResultsSlice.ts
+3
-1
src/content/app/tools/blast/state/epics/tests/blastEpics.test.ts
...tent/app/tools/blast/state/epics/tests/blastEpics.test.ts
+8
-8
src/content/app/tools/blast/state/epics/tests/fixtures/blastSubmissionFixtures.ts
...ast/state/epics/tests/fixtures/blastSubmissionFixtures.ts
+14
-8
No files found.
src/content/app/tools/blast/components/blast-job-submit/BlastJobSubmit.test.tsx
View file @
e0963c5b
...
...
@@ -80,7 +80,10 @@ const mockState = merge({}, initialState, {
const
expectedPayload
=
{
species
:
selectedSpecies
,
querySequences
:
sequences
.
map
((
seq
)
=>
toFasta
(
seq
)),
sequences
:
sequences
.
map
((
seq
,
index
)
=>
({
id
:
index
+
1
,
value
:
toFasta
(
seq
)
})),
parameters
:
{
title
:
jobName
,
database
,
...
...
src/content/app/tools/blast/components/blast-job-submit/BlastJobSubmit.tsx
View file @
e0963c5b
...
...
@@ -42,7 +42,7 @@ import type { BlastSubmission } from 'src/content/app/tools/blast/state/blast-re
export
type
PayloadParams
=
{
species
:
Species
[];
queryS
equences
:
string
[];
s
equences
:
{
id
:
number
;
value
:
string
}
[];
parameters
:
Partial
<
Record
<
BlastParameterName
,
string
>>
&
{
title
:
string
;
stype
:
SequenceType
;
...
...
@@ -100,13 +100,16 @@ const BlastJobSubmit = () => {
export
const
createBlastSubmissionData
=
(
blastFormData
:
BlastFormState
):
PayloadParams
=>
{
const
sequences
=
blastFormData
.
sequences
.
map
((
sequence
)
=>
toFasta
(
sequence
)
);
// labelling sequences with complely artificial identifiers
// so that job ids in the response can be matched to individual combinations of sequences and genome ids
const
sequences
=
blastFormData
.
sequences
.
map
((
sequence
,
index
)
=>
({
id
:
index
+
1
,
value
:
toFasta
(
sequence
)
}));
return
{
species
:
blastFormData
.
selectedSpecies
,
querySequences
:
sequences
,
sequences
,
parameters
:
{
title
:
blastFormData
.
settings
.
jobName
,
database
:
blastFormData
.
settings
.
parameters
.
database
,
...
...
src/content/app/tools/blast/state/blast-api/blastApiSlice.ts
View file @
e0963c5b
...
...
@@ -24,16 +24,25 @@ import type { BlastSubmission } from '../blast-results/blastResultsSlice';
export
type
BlastSubmissionPayload
=
{
species
:
Species
[];
queryS
equences
:
string
[];
s
equences
:
{
id
:
number
;
value
:
string
}
[];
parameters
:
Record
<
string
,
string
>
;
};
export
type
BlastSubmissionResponse
=
{
submissionId
:
string
;
jobs
:
Array
<
{
jobId
?:
string
;
error
?:
string
;
}
>
;
submission_id
:
string
;
jobs
:
Array
<
SubmittedJob
|
RejectedJob
>
;
};
export
type
SubmittedJob
=
{
job_id
:
string
;
sequence_id
:
number
;
genome_id
:
string
;
};
export
type
RejectedJob
=
{
sequence_id
:
number
;
genome_id
:
string
;
error
:
string
;
};
const
blastApiSlice
=
restApiSlice
.
injectEndpoints
({
...
...
@@ -50,8 +59,8 @@ const blastApiSlice = restApiSlice.injectEndpoints({
>
({
query
(
payload
)
{
const
body
=
{
genome
I
ds
:
payload
.
species
.
map
(({
genome_id
})
=>
genome_id
),
query
S
equences
:
payload
.
queryS
equences
,
genome
_i
ds
:
payload
.
species
.
map
(({
genome_id
})
=>
genome_id
),
query
_s
equences
:
payload
.
s
equences
,
parameters
:
payload
.
parameters
};
return
{
...
...
@@ -61,20 +70,25 @@ const blastApiSlice = restApiSlice.injectEndpoints({
};
},
transformResponse
(
response
:
BlastSubmissionResponse
,
_
,
payload
)
{
const
{
submissionId
,
jobs
}
=
response
;
const
{
submission_id
:
submissionId
,
jobs
}
=
response
;
// TODO: decide what to do when a submission returns error jobs
const
results
=
jobs
.
map
((
job
)
=>
({
jobId
:
job
.
jobId
as
string
,
status
:
'
RUNNING
'
,
seen
:
false
,
data
:
null
}));
const
results
=
jobs
.
filter
((
job
):
job
is
SubmittedJob
=>
'
job_id
'
in
job
)
.
map
((
job
)
=>
({
jobId
:
job
.
job_id
,
genomeId
:
job
.
genome_id
,
sequenceId
:
job
.
sequence_id
,
status
:
'
RUNNING
'
,
seen
:
false
,
data
:
null
}));
return
{
submissionId
,
submission
:
{
submittedData
:
{
species
:
payload
.
species
,
sequences
:
payload
.
queryS
equences
,
sequences
:
payload
.
s
equences
,
parameters
:
payload
.
parameters
},
results
,
...
...
src/content/app/tools/blast/state/blast-results/blastResultsSlice.ts
View file @
e0963c5b
...
...
@@ -37,11 +37,13 @@ export type JobStatus =
export
type
BlastSubmission
=
{
submittedData
:
{
species
:
Species
[];
sequences
:
string
[];
//
Or perhaps
parsed sequences
?
sequences
:
{
id
:
number
;
value
:
string
}
[];
//
TODO: consider whether to have strings or
parsed sequences
parameters
:
Partial
<
Record
<
BlastParameterName
,
string
>>
;
};
results
:
Array
<
{
jobId
:
string
;
sequenceId
:
number
;
genomeId
:
string
;
status
:
JobStatus
;
seen
:
boolean
;
data
:
null
;
// TODO: add data type
...
...
src/content/app/tools/blast/state/epics/tests/blastEpics.test.ts
View file @
e0963c5b
...
...
@@ -142,7 +142,7 @@ describe('blast epics', () => {
'
http://tools-api-url/blast/jobs/status/:jobId
'
,
(
req
,
res
,
ctx
)
=>
{
const
{
jobId
}
=
req
.
params
;
if
(
jobId
===
firstJobInResponse
.
job
I
d
)
{
if
(
jobId
===
firstJobInResponse
.
job
_i
d
)
{
firstJobPollCount
++
;
return
firstJobPollCount
>=
firstJobMaxPollCount
?
res
(
ctx
.
json
(
createFinishedJobStatusResponse
()))
...
...
@@ -176,14 +176,14 @@ describe('blast epics', () => {
// check that the job status gets updated in indexedDB
expect
(
blastStorageService
.
updateSavedBlastJob
).
toHaveBeenCalledWith
({
submissionId
:
successfulSubmission
.
submission
I
d
,
jobId
:
firstJobInResponse
.
job
I
d
,
submissionId
:
successfulSubmission
.
submission
_i
d
,
jobId
:
firstJobInResponse
.
job
_i
d
,
fragment
:
{
status
:
'
FINISHED
'
}
});
expect
(
blastStorageService
.
updateSavedBlastJob
).
toHaveBeenCalledWith
({
submissionId
:
successfulSubmission
.
submission
I
d
,
jobId
:
secondJobInResponse
.
job
I
d
,
submissionId
:
successfulSubmission
.
submission
_i
d
,
jobId
:
secondJobInResponse
.
job
_i
d
,
fragment
:
{
status
:
'
FAILURE
'
}
});
});
...
...
@@ -199,7 +199,7 @@ describe('blast epics', () => {
const
jobId
=
req
.
params
.
jobId
as
string
;
if
(
!
jobMap
[
jobId
])
{
jobMap
[
jobId
]
=
true
;
if
(
jobId
===
firstJobInResponse
.
job
I
d
)
{
if
(
jobId
===
firstJobInResponse
.
job
_i
d
)
{
return
res
(
ctx
.
status
(
404
));
}
else
{
return
res
.
networkError
(
'
Failed to connect
'
);
...
...
@@ -236,7 +236,7 @@ describe('blast epics', () => {
jest
.
spyOn
(
blastStorageService
,
'
getAllBlastSubmissions
'
)
.
mockImplementation
(
async
()
=>
({
[
successfulSubmission
.
submission
I
d
]:
storedBlastSubmission
[
successfulSubmission
.
submission
_i
d
]:
storedBlastSubmission
}));
it
(
'
polls status of unfinished jobs
'
,
async
()
=>
{
...
...
@@ -273,7 +273,7 @@ describe('blast epics', () => {
// check that the job status gets updated in indexedDB
expect
(
blastStorageService
.
updateSavedBlastJob
).
toHaveBeenCalledWith
({
submissionId
:
successfulSubmission
.
submission
I
d
,
submissionId
:
successfulSubmission
.
submission
_i
d
,
jobId
:
unfinishedJob
.
jobId
,
fragment
:
{
status
:
'
FINISHED
'
}
});
...
...
src/content/app/tools/blast/state/epics/tests/fixtures/blastSubmissionFixtures.ts
View file @
e0963c5b
...
...
@@ -19,7 +19,8 @@ import times from 'lodash/times';
import
type
{
BlastSubmissionPayload
,
BlastSubmissionResponse
BlastSubmissionResponse
,
SubmittedJob
}
from
'
src/content/app/tools/blast/state/blast-api/blastApiSlice
'
;
import
type
{
BlastSubmission
,
...
...
@@ -38,7 +39,7 @@ export const createBlastSubmission = (
const
submission
=
{
species
:
[
human
],
queryS
equences
:
[
'
ACGT
'
],
s
equences
:
[
{
id
:
1
,
value
:
'
ACGT
'
}
],
parameters
:
{}
};
...
...
@@ -52,7 +53,7 @@ export const createBlastSubmissionResponse = (
fragment
:
Partial
<
BlastSubmissionResponse
>
=
{}
):
BlastSubmissionResponse
=>
{
const
submission
=
{
submission
I
d
:
faker
.
datatype
.
uuid
(),
submission
_i
d
:
faker
.
datatype
.
uuid
(),
jobs
:
times
(
3
,
createSuccessfulBlastJobInSubmissionResponse
)
};
...
...
@@ -62,11 +63,14 @@ export const createBlastSubmissionResponse = (
};
};
export
const
createSuccessfulBlastJobInSubmissionResponse
=
()
=>
{
return
{
jobId
:
faker
.
datatype
.
uuid
()
export
const
createSuccessfulBlastJobInSubmissionResponse
=
():
SubmittedJob
=>
{
return
{
genome_id
:
'
human-genome-id
'
,
sequence_id
:
1
,
job_id
:
faker
.
datatype
.
uuid
()
};
};
};
export
const
createRunningJobStatusResponse
=
():
{
status
:
JobStatus
}
=>
({
status
:
'
RUNNING
'
...
...
@@ -93,7 +97,7 @@ export const createStoredBlastSubmission = (
const
submission
=
{
submittedData
:
{
species
:
[
human
],
sequences
:
[
'
ACGT
'
],
sequences
:
[
{
id
:
1
,
value
:
'
ACGT
'
}
],
parameters
:
{}
},
results
:
[
createStoredBlastJobResult
()],
...
...
@@ -111,6 +115,8 @@ export const createStoredBlastJobResult = (
)
=>
{
return
{
jobId
:
faker
.
datatype
.
uuid
(),
sequenceId
:
1
,
genomeId
:
'
human-genome-id
'
,
status
:
'
RUNNING
'
as
JobStatus
,
seen
:
false
,
data
:
null
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment