use of com.b2international.snowowl.core.events.Request in project snow-owl by b2ihealthcare.
the class CommitInfoRequestTest method searchCommitInfoByTimestamp.
@Test
public void searchCommitInfoByTimestamp() {
final String oid = UUID.randomUUID().toString();
final String shortName = UUID.randomUUID().toString();
final String comment = "Code system for commit info 5";
createCodeSystem(shortName, oid, comment);
final CommitInfo commitInfo = getCommitInfoByComment(comment);
Request<RepositoryContext, CommitInfos> req = RepositoryRequests.commitInfos().prepareSearchCommitInfo().filterByTimestamp(commitInfo.getTimestamp()).build();
final CommitInfos commitInfos = new ResourceRepositoryRequestBuilder<CommitInfos>() {
@Override
public Request<RepositoryContext, CommitInfos> build() {
return req;
}
}.buildAsync().execute(bus).getSync();
assertTrue(commitInfos.getTotal() == 1);
assertEquals(commitInfo.getTimestamp(), Iterables.getOnlyElement(commitInfos.getItems()).getTimestamp());
}
use of com.b2international.snowowl.core.events.Request in project snow-owl by b2ihealthcare.
the class CommitInfoRequestTest method searchCommitInfoByUserId.
@Test
public void searchCommitInfoByUserId() {
final String oid = UUID.randomUUID().toString();
final String shortName = UUID.randomUUID().toString();
final String comment = "Code system for commit info 3";
final String userId = "commitInfo";
createCodeSystem(oid, shortName, comment, userId);
Request<RepositoryContext, CommitInfos> req = RepositoryRequests.commitInfos().prepareSearchCommitInfo().filterByAuthor(userId).build();
final CommitInfos commitInfos = new ResourceRepositoryRequestBuilder<CommitInfos>() {
@Override
public Request<RepositoryContext, CommitInfos> build() {
return req;
}
}.buildAsync().execute(bus).getSync();
assertEquals(commitInfos.getTotal(), 1);
final CommitInfo commitInfo = Iterables.getOnlyElement(commitInfos);
assertEquals(userId, commitInfo.getAuthor());
}
use of com.b2international.snowowl.core.events.Request in project snow-owl by b2ihealthcare.
the class IdRequest method execute.
@Override
public R execute(final C context) {
final IdActionRecorder recorder = new IdActionRecorder(context);
try {
final Multimap<ComponentCategory, SnomedComponentCreateRequest> componentCreateRequests = getComponentCreateRequests(next());
if (!componentCreateRequests.isEmpty()) {
try {
for (final ComponentCategory category : componentCreateRequests.keySet()) {
final Class<? extends SnomedDocument> documentClass = getDocumentClass(category);
final Collection<SnomedComponentCreateRequest> categoryRequests = componentCreateRequests.get(category);
final Set<String> coreComponentIds = FluentIterable.from(categoryRequests).filter(SnomedCoreComponentCreateRequest.class).filter(request -> request.getIdGenerationStrategy() instanceof ConstantIdStrategy).transform(request -> ((ConstantIdStrategy) request.getIdGenerationStrategy()).getId()).toSet();
final Set<String> refsetMemberIds = FluentIterable.from(categoryRequests).filter(SnomedRefSetMemberCreateRequest.class).transform(request -> request.getId()).toSet();
final Set<String> userRequestedIds = Sets.newHashSet(Iterables.concat(coreComponentIds, refsetMemberIds));
final Set<String> existingIds = getExistingIds(context, userRequestedIds, documentClass);
if (!existingIds.isEmpty()) {
// TODO: Report all existing identifiers
throw new AlreadyExistsException(category.getDisplayName(), Iterables.getFirst(existingIds, null));
} else {
if (!coreComponentIds.isEmpty()) {
recorder.register(coreComponentIds);
}
}
final Multimap<String, BaseSnomedComponentCreateRequest> requestsByNamespace = HashMultimap.create();
// index requests where an explicit namespace identifier is specified (use it directly)
categoryRequests.stream().filter(BaseSnomedComponentCreateRequest.class::isInstance).map(BaseSnomedComponentCreateRequest.class::cast).filter(request -> request.getIdGenerationStrategy() instanceof NamespaceIdStrategy).forEach(request -> {
requestsByNamespace.put(getNamespaceKey(request), request);
});
// convert requests that define a namespaceConceptId by extracting the namespaceId from the namespaceConcept's FSN
final Multimap<String, BaseSnomedComponentCreateRequest> requestsByNamespaceConceptId = HashMultimap.create();
categoryRequests.stream().filter(BaseSnomedComponentCreateRequest.class::isInstance).map(BaseSnomedComponentCreateRequest.class::cast).filter(request -> request.getIdGenerationStrategy() instanceof NamespaceConceptIdStrategy).forEach(request -> {
requestsByNamespaceConceptId.put(request.getIdGenerationStrategy().getNamespace(), request);
});
if (!requestsByNamespaceConceptId.isEmpty()) {
final Map<String, String> namespacesByNamespaceConceptId = context.service(NamespaceIdProvider.class).extractNamespaceIds(context, requestsByNamespaceConceptId.keySet(), false);
for (String namespaceConceptId : Set.copyOf(requestsByNamespaceConceptId.keySet())) {
Collection<BaseSnomedComponentCreateRequest> requests = requestsByNamespaceConceptId.removeAll(namespaceConceptId);
if (!namespacesByNamespaceConceptId.containsKey(namespaceConceptId)) {
throw new BadRequestException("There is no namespace value associated with the '%s' namespaceConcept's FSN.", namespaceConceptId);
}
requestsByNamespace.putAll(namespacesByNamespaceConceptId.get(namespaceConceptId), requests);
}
}
for (final String namespace : requestsByNamespace.keySet()) {
final String convertedNamespace = SnomedIdentifiers.INT_NAMESPACE.equals(namespace) ? null : namespace;
final Collection<BaseSnomedComponentCreateRequest> namespaceRequests = requestsByNamespace.get(namespace);
final int count = namespaceRequests.size();
final Set<String> uniqueIds = getUniqueIds(context, recorder, category, documentClass, count, convertedNamespace);
final Iterator<String> idsToUse = Iterators.consumingIterator(uniqueIds.iterator());
for (final BaseSnomedComponentCreateRequest createRequest : namespaceRequests) {
createRequest.setIdGenerationStrategy(new ConstantIdStrategy(idsToUse.next()));
}
checkState(!idsToUse.hasNext(), "More SNOMED CT ids have been requested than used.");
}
}
} finally {
// idGenerationSample.stop(registry.timer("idGenerationTime"));
}
}
final R commitInfo = next(context);
recorder.commit();
return commitInfo;
} catch (final Exception e) {
recorder.rollback();
throw e;
}
}
use of com.b2international.snowowl.core.events.Request in project snow-owl by b2ihealthcare.
the class SnomedBulkRequest method execute.
@Override
public R execute(TransactionContext context) {
ImmutableList.Builder<SnomedComponentRequest<?>> requests = ImmutableList.builder();
ImmutableList.Builder<DeleteRequest> deletions = ImmutableList.builder();
collectNestedRequests(next(), requests, deletions);
// Prefetch all component IDs mentioned in reference set member creation requests, abort if any of them can not be found
final Set<String> requiredComponentIds = requests.build().stream().flatMap(request -> request.getRequiredComponentIds(context).stream()).filter(// just in case filter out invalid component IDs
componentId -> SnomedComponent.getTypeSafe(componentId) != null || isMember(componentId)).collect(Collectors.toSet());
final Multimap<Class<? extends SnomedDocument>, String> componentIdsByType = HashMultimap.create();
for (String requiredComponentId : requiredComponentIds) {
if (!Strings.isNullOrEmpty(requiredComponentId)) {
componentIdsByType.put(this.getDocType(requiredComponentId), requiredComponentId);
}
}
// collect all deleted IDs as well
deletions.build().stream().map(DeleteRequest::getComponentId).forEach(componentId -> componentIdsByType.put(getDocType(componentId), componentId));
try {
for (final Entry<Class<? extends SnomedDocument>, Collection<String>> idsForType : componentIdsByType.asMap().entrySet()) {
context.lookup(idsForType.getValue(), idsForType.getKey());
}
} catch (final ComponentNotFoundException e) {
throw e.toBadRequestException();
}
// bind additional caches to the context
TransactionContext newContext = context.inject().bind(SnomedOWLExpressionConverter.class, new SnomedOWLExpressionConverter(context)).build();
return next(newContext);
}
use of com.b2international.snowowl.core.events.Request in project snow-owl by b2ihealthcare.
the class SaveJobRequest method persistChanges.
private Boolean persistChanges(final BranchContext context, final IProgressMonitor monitor) {
// Repeat the same checks as in ClassificationSaveRequest, now within the lock
final ClassificationTask classification = ClassificationRequests.prepareGetClassification(classificationId).build().execute(context);
final String branchPath = classification.getBranch();
final Branch branch = RepositoryRequests.branching().prepareGet(branchPath).build().execute(context);
if (!ClassificationSaveRequest.SAVEABLE_STATUSES.contains(classification.getStatus())) {
throw new BadRequestException("Classification '%s' is not in the expected state to start saving changes.", classificationId);
}
if (classification.getTimestamp() < branch.headTimestamp()) {
throw new BadRequestException("Classification '%s' on branch '%s' is stale (classification timestamp: %s, head timestamp: %s).", classificationId, branchPath, classification.getTimestamp(), branch.headTimestamp());
}
final ClassificationTracker classificationTracker = context.service(ClassificationTracker.class);
// Signal the state change
classificationTracker.classificationSaving(classificationId);
final SubMonitor subMonitor = SubMonitor.convert(monitor, "Persisting changes", 6);
final BulkRequestBuilder<TransactionContext> bulkRequestBuilder = BulkRequest.create();
applyChanges(subMonitor, context, bulkRequestBuilder);
long resultTimeStamp = Commit.NO_COMMIT_TIMESTAMP;
for (List<Request<TransactionContext, ?>> partition : Iterables.partition(bulkRequestBuilder.build().getRequests(), getCommitLimit(context))) {
final BulkRequestBuilder<TransactionContext> batchRequest = BulkRequest.create();
partition.forEach(request -> batchRequest.add(request));
final Request<BranchContext, CommitResult> commitRequest = SnomedRequests.prepareCommit().setBody(batchRequest.build()).setCommitComment(commitComment).setParentContextDescription(DatastoreLockContextDescriptions.SAVE_CLASSIFICATION_RESULTS).setAuthor(userId).build();
final CommitResult commitResult = new IdRequest<>(commitRequest).execute(context);
resultTimeStamp = commitResult.getCommitTimestamp();
}
if (Commit.NO_COMMIT_TIMESTAMP == resultTimeStamp) {
classificationTracker.classificationSaveFailed(classificationId);
return Boolean.FALSE;
} else {
classificationTracker.classificationSaved(classificationId, resultTimeStamp);
return Boolean.TRUE;
}
}
Aggregations