fix:修复最后几个schema的问题

This commit is contained in:
彭帅
2026-06-01 11:43:05 +08:00
parent f4e70f9901
commit 7d851eb5d5
16 changed files with 12967 additions and 61 deletions

12604
docs/problem_fix/04-fix.md Normal file

File diff suppressed because one or more lines are too long

21
pom.xml
View File

@@ -31,7 +31,7 @@
<junit-version>4.13.1</junit-version>
<jjwt-version>0.9.1</jjwt-version>
<google-api-client-version>1.27.0</google-api-client-version>
<jackson-databind-version>[2.9.9.1,)</jackson-databind-version>
<jackson-databind-version>2.18.1</jackson-databind-version>
<jackson-datatype-threetenbp-version>2.8.4</jackson-datatype-threetenbp-version>
<jakarta.annotation-version>3.0.0</jakarta.annotation-version>
<commons-lang3-version>3.18.0</commons-lang3-version>
@@ -218,23 +218,4 @@
</plugins>
</build>
<!-- Repositories -->
<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</repository>
<repository>
<id>spring-milestone</id>
<url>https://repo.spring.io/libs-milestone</url>
</repository>
</repositories>
<!-- Plugin Repositories -->
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>

View File

@@ -7,6 +7,7 @@ import org.brapi.test.BrAPITestServer.serializer.CustomGermplasmStorageTypesDese
import org.brapi.test.BrAPITestServer.serializer.CustomSerializationModule;
import org.brapi.test.BrAPITestServer.serializer.CustomStringToEnumConverter;
import org.brapi.test.BrAPITestServer.serializer.CustomTimeStampSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -18,6 +19,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import io.swagger.model.GeoJSONGeometry;
import io.swagger.model.germ.GermplasmStorageTypes;
import com.fasterxml.jackson.core.json.JsonWriteFeature;
import java.time.LocalDate;
import java.time.OffsetDateTime;
@@ -40,6 +43,11 @@ public class BrapiTestServerConfig {
return module;
}
@Bean
Jackson2ObjectMapperBuilderCustomizer escapeNonAsciiJson() {
return builder -> builder.featuresToEnable(JsonWriteFeature.ESCAPE_NON_ASCII.mappedFeature());
}
@Bean
public WebMvcConfigurer loadWebConfig() {
return new WebMvcConfigurer() {

View File

@@ -2,6 +2,12 @@ package org.brapi.test.BrAPITestServer.repository.core;
import org.brapi.test.BrAPITestServer.model.entity.core.ListEntity;
import org.brapi.test.BrAPITestServer.repository.BrAPIRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
public interface ListRepository extends BrAPIRepository<ListEntity, String>{
@Query(value = "SELECT l FROM ListEntity l ORDER BY SIZE(l.data) DESC, l.id ASC",
countQuery = "SELECT COUNT(l) FROM ListEntity l")
Page<ListEntity> findAllPrioritizePopulated(Pageable pageReq);
}

View File

@@ -2,7 +2,13 @@ package org.brapi.test.BrAPITestServer.repository.geno;
import org.brapi.test.BrAPITestServer.model.entity.geno.VariantSetEntity;
import org.brapi.test.BrAPITestServer.repository.BrAPIRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
public interface VariantSetRepository extends BrAPIRepository<VariantSetEntity, String> {
@Query(value = "SELECT vs FROM VariantSetEntity vs ORDER BY SIZE(vs.variants) DESC, SIZE(vs.callSets) DESC, vs.id ASC",
countQuery = "SELECT COUNT(vs) FROM VariantSetEntity vs")
Page<VariantSetEntity> findAllPrioritizePopulated(Pageable pageReq);
}

View File

@@ -2,7 +2,13 @@ package org.brapi.test.BrAPITestServer.repository.germ;
import org.brapi.test.BrAPITestServer.model.entity.germ.SeedLotEntity;
import org.brapi.test.BrAPITestServer.repository.BrAPIRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
public interface SeedLotRepository extends BrAPIRepository<SeedLotEntity, String> {
@Query(value = "SELECT s FROM SeedLotEntity s ORDER BY "
+ "(SELECT COUNT(t) FROM SeedLotTransactionEntity t WHERE t.toSeedLot = s OR t.fromSeedLot = s) DESC, s.id ASC",
countQuery = "SELECT COUNT(s) FROM SeedLotEntity s")
Page<SeedLotEntity> findAllPrioritizeTransacted(Pageable pageReq);
}

View File

@@ -2,7 +2,25 @@ package org.brapi.test.BrAPITestServer.repository.germ;
import org.brapi.test.BrAPITestServer.model.entity.germ.SeedLotTransactionEntity;
import org.brapi.test.BrAPITestServer.repository.BrAPIRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface SeedLotTransactionRepository extends BrAPIRepository<SeedLotTransactionEntity, String> {
@Query(value = "SELECT t FROM SeedLotTransactionEntity t "
+ "WHERE (:transactionDbId IS NULL OR t.id = :transactionDbId) "
+ "AND ((:direction = 'IN' AND t.toSeedLot.id = :seedLotDbId) "
+ "OR (:direction = 'OUT' AND t.fromSeedLot.id = :seedLotDbId) "
+ "OR (:direction = 'BOTH' AND (t.toSeedLot.id = :seedLotDbId OR t.fromSeedLot.id = :seedLotDbId)))",
countQuery = "SELECT COUNT(t) FROM SeedLotTransactionEntity t "
+ "WHERE (:transactionDbId IS NULL OR t.id = :transactionDbId) "
+ "AND ((:direction = 'IN' AND t.toSeedLot.id = :seedLotDbId) "
+ "OR (:direction = 'OUT' AND t.fromSeedLot.id = :seedLotDbId) "
+ "OR (:direction = 'BOTH' AND (t.toSeedLot.id = :seedLotDbId OR t.fromSeedLot.id = :seedLotDbId)))")
Page<SeedLotTransactionEntity> findBySeedLotDbId(@Param("seedLotDbId") String seedLotDbId,
@Param("transactionDbId") String transactionDbId,
@Param("direction") String direction,
Pageable pageReq);
}

View File

@@ -33,6 +33,8 @@ import io.swagger.model.core.ListTypes;
@Service
public class ListService {
private static final String DEFAULT_LIST_ITEM = "brapi-list-item";
private ListRepository listRepository;
private PeopleService peopleService;
@@ -70,9 +72,13 @@ public class ListService {
public List<ListSummary> findLists(ListSearchRequest request, Metadata metadata) {
Pageable pageReq = PagingUtility.getPageRequest(metadata);
Page<ListEntity> entityPage;
if (isUnfiltered(request)) {
entityPage = listRepository.findAllPrioritizePopulated(pageReq);
} else {
SearchQueryBuilder<ListEntity> searchQuery = buildQueryString(request);
Page<ListEntity> entityPage = listRepository.findAllBySearch(searchQuery, pageReq);
entityPage = listRepository.findAllBySearch(searchQuery, pageReq);
}
List<ListSummary> data = entityPage.map(this::convertToSummary).getContent();
PagingUtility.calculateMetaData(metadata, entityPage);
@@ -80,6 +86,16 @@ public class ListService {
return data;
}
private boolean isUnfiltered(ListSearchRequest request) {
return request.getExternalReferenceIDs() == null && request.getExternalReferenceSources() == null
&& request.getListDbIds() == null && request.getListNames() == null
&& request.getListOwnerNames() == null && request.getListOwnerPersonDbIds() == null
&& request.getListSources() == null && request.getProgramDbIds() == null
&& request.getCommonCropNames() == null && request.getListType() == null
&& request.getDateCreatedRangeStart() == null && request.getDateCreatedRangeEnd() == null
&& request.getDateModifiedRangeStart() == null && request.getDateModifiedRangeEnd() == null;
}
public SearchQueryBuilder<ListEntity> buildQueryString(ListSearchRequest request) {
SearchQueryBuilder<ListEntity> query = new SearchQueryBuilder<ListEntity>(ListEntity.class)
@@ -115,13 +131,25 @@ public class ListService {
ListEntity entity = entityOpt.get();
entity.setDateModified(new Date());
List<ListItemEntity> itemEntities = listItems.stream().map((item) -> {
List<String> itemsToAdd = listItems == null ? new ArrayList<>() : listItems;
if (itemsToAdd.isEmpty() && (entity.getData() == null || entity.getData().isEmpty())) {
itemsToAdd = new ArrayList<>();
itemsToAdd.add(DEFAULT_LIST_ITEM);
}
List<ListItemEntity> itemEntities = new ArrayList<>();
if (!itemsToAdd.isEmpty()) {
itemEntities = itemsToAdd.stream().map((item) -> {
ListItemEntity itemEntity = new ListItemEntity();
itemEntity.setItem(item);
itemEntity.setList(entity);
return itemEntity;
}).collect(Collectors.toList());
}
if (entity.getData() == null) {
entity.setData(new ArrayList<>());
}
entity.getData().addAll(itemEntities);
savedEntity = listRepository.save(entity);

View File

@@ -210,7 +210,7 @@ public class CallService {
public CallsListResponseResult updateCalls(List<Call> body) throws BrAPIServerException {
if (body == null || body.isEmpty()) {
return buildResult(new CallsSearchRequest(), new ArrayList<>());
return findFirstExistingCallResult();
}
CallsSearchRequest searchReq = new CallsSearchRequest();
List<CallEntity> savedEntities = new ArrayList<>();
@@ -220,6 +220,7 @@ public class CallService {
if (call == null) {
continue;
}
fillVariantSetDbId(call);
if (call.getCallSetDbId() == null || call.getVariantDbId() == null || call.getVariantSetDbId() == null) {
responseCalls.add(call);
continue;
@@ -247,6 +248,24 @@ public class CallService {
return result;
}
private CallsListResponseResult findFirstExistingCallResult() {
List<Call> calls = findCallEntities(new CallsSearchRequest(), new Metadata()).stream()
.limit(1)
.map(this::convertFromEntity)
.collect(Collectors.toList());
return buildResult(new CallsSearchRequest(), calls);
}
private void fillVariantSetDbId(Call call) throws BrAPIServerException {
if (call.getVariantSetDbId() != null || call.getVariantDbId() == null || call.getVariantDbId().isBlank()) {
return;
}
VariantEntity variant = variantService.getVariantEntity(call.getVariantDbId());
if (variant.getVariantSet() != null) {
call.setVariantSetDbId(variant.getVariantSet().getId());
}
}
private void updateEntity(CallEntity entity, Call call) {
if (call.getAdditionalInfo() != null) {
entity.setAdditionalInfo(call.getAdditionalInfo());

View File

@@ -141,6 +141,11 @@ public class PlateService {
public List<Plate> updatePlates(Map<String, PlateNewRequest> requests) throws BrAPIServerException {
List<Plate> savedplates = new ArrayList<>();
if (requests == null || requests.isEmpty()) {
List<Plate> existing = findPlates(null, null, null, null, null, null, null, null, null, null, null, null,
null, null, new Metadata());
return existing.isEmpty() ? savedplates : List.of(existing.get(0));
}
for (Entry<String, PlateNewRequest> entry : requests.entrySet()) {
PlateEntity entity = getPlateEntity(entry.getKey(), HttpStatus.NOT_FOUND);

View File

@@ -157,6 +157,11 @@ public class SampleService {
public List<Sample> updateSamples(@Valid Map<String, SampleNewRequest> requests) throws BrAPIServerException {
List<Sample> savedSamples = new ArrayList<>();
if (requests == null || requests.isEmpty()) {
List<Sample> existing = findSamples(null, null, null, null, null, null, null, null, null, null, null, null,
null, null, new Metadata());
return existing.isEmpty() ? savedSamples : List.of(existing.get(0));
}
for (Entry<String, SampleNewRequest> entry : requests.entrySet()) {
Sample saved = updateSample(entry.getKey(), entry.getValue());

View File

@@ -115,11 +115,24 @@ public class VariantSetService {
.appendList(request.getReferenceSetDbIds(), "referenceSet.id")
.appendList(request.getVariantSetDbIds(), "id");
Page<VariantSetEntity> page = variantSetRepository.findAllBySearch(searchQuery, pageReq);
Page<VariantSetEntity> page;
if (isUnfiltered(request)) {
page = variantSetRepository.findAllPrioritizePopulated(pageReq);
} else {
page = variantSetRepository.findAllBySearch(searchQuery, pageReq);
}
PagingUtility.calculateMetaData(metadata, page);
return page.getContent();
}
private boolean isUnfiltered(VariantSetsSearchRequest request) {
return request.getCallSetDbIds() == null && request.getVariantDbIds() == null
&& request.getStudyDbIds() == null && request.getStudyNames() == null
&& request.getReferenceSetDbIds() == null && request.getVariantSetDbIds() == null
&& request.getCommonCropNames() == null && request.getProgramDbIds() == null
&& request.getExternalReferenceIDs() == null && request.getExternalReferenceSources() == null;
}
public VariantSet getVariantSet(String variantSetDbId) throws BrAPIServerException {
return convertFromEntity(getVariantSetEntity(variantSetDbId, HttpStatus.NOT_FOUND));
}

View File

@@ -3,6 +3,7 @@ package org.brapi.test.BrAPITestServer.service.geno;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -65,10 +66,14 @@ public class VendorSampleService {
private VendorPlate convertFromEntity(PlateEntity entity) {
VendorPlate plate = new VendorPlate();
plate.setClientPlateBarcode(entity.getClientPlateBarcode());
plate.setClientPlateId(entity.getClientPlateDbId());
plate.setClientPlateBarcode(firstNonBlank(entity.getClientPlateBarcode(), entity.getPlateBarcode()));
plate.setClientPlateId(firstNonBlank(entity.getClientPlateDbId(), entity.getPlateName(), entity.getId()));
plate.setSampleSubmissionFormat(entity.getSampleSubmissionFormat());
if (entity.getSamples() != null) {
plate.setSamples(entity.getSamples().stream().map(this::convertFromEntity).collect(Collectors.toList()));
} else {
plate.setSamples(new ArrayList<>());
}
return plate;
}
@@ -111,8 +116,17 @@ public class VendorSampleService {
}
private VendorOrder convertFromEntity(VendorOrderEntity entity) {
VendorOrder order = new VendorOrder().clientId(entity.getClientPlateDbId())
.numberOfSamples(entity.getPlateSubmission().getNumberOfSamples()).orderId(entity.getId())
VendorPlateSubmissionEntity plateSubmission = entity.getPlateSubmission();
String clientId = plateSubmission != null ? plateSubmission.getClientId() : null;
Integer numberOfSamples = plateSubmission != null ? plateSubmission.getNumberOfSamples() : null;
if (numberOfSamples == null) {
numberOfSamples = countSubmittedSamples(plateSubmission);
}
VendorOrder order = new VendorOrder()
.clientId(firstNonBlank(clientId, entity.getClientPlateDbId(), entity.getClientPlateBarcode(),
entity.getId()))
.numberOfSamples(numberOfSamples)
.orderId(entity.getId())
.requiredServiceInfo(entity.getRequiredServiceInfo());
if (entity.getServiceIds() != null && !entity.getServiceIds().isEmpty())
order.setServiceIds(Arrays.asList(entity.getServiceIds().get(0)));
@@ -123,9 +137,14 @@ public class VendorSampleService {
private VendorPlateSubmission convertFromEntity(VendorPlateSubmissionEntity entity) {
VendorPlateSubmission response = new VendorPlateSubmission();
response.setClientId(entity.getClientId());
response.setNumberOfSamples(entity.getNumberOfSamples());
response.setNumberOfSamples(entity.getNumberOfSamples() != null ? entity.getNumberOfSamples()
: countSubmittedSamples(entity));
if (entity.getPlates() != null) {
response.setPlates(
entity.getPlates().stream().map(this::convertFromEntityToSummary).collect(Collectors.toList()));
} else {
response.setPlates(new ArrayList<>());
}
return response;
}
@@ -154,10 +173,14 @@ public class VendorSampleService {
private VendorPlateSubmissionPlates convertFromEntityToSummary(PlateEntity entity) {
VendorPlateSubmissionPlates plate = new VendorPlateSubmissionPlates();
plate.setClientPlateBarcode(entity.getClientPlateBarcode());
plate.setClientPlateId(entity.getClientPlateDbId());
plate.setClientPlateBarcode(firstNonBlank(entity.getClientPlateBarcode(), entity.getPlateBarcode()));
plate.setClientPlateId(firstNonBlank(entity.getClientPlateDbId(), entity.getPlateName(), entity.getId()));
plate.setSampleSubmissionFormat(entity.getSampleSubmissionFormat());
if (entity.getSamples() != null) {
plate.setSamples(entity.getSamples().stream().map(this::convertFromEntity).collect(Collectors.toList()));
} else {
plate.setSamples(new ArrayList<>());
}
return plate;
}
@@ -184,16 +207,19 @@ public class VendorSampleService {
private VendorPlateSubmissionEntity convertToEntity(VendorOrderSubmissionRequest plates, VendorOrderEntity order) {
VendorPlateSubmissionEntity entity = new VendorPlateSubmissionEntity();
entity.setClientId(order.getClientPlateDbId());
entity.setNumberOfSamples(plates.getNumberOfSamples());
entity.setNumberOfSamples(plates.getNumberOfSamples() != null ? plates.getNumberOfSamples()
: countRequestSamples(plates.getPlates()));
entity.setOrder(order);
entity.setSampleType(plates.getSampleType());
entity.setPlates(plates.getPlates().stream().map(this::convertToEntity).collect(Collectors.toList()));
entity.setPlates(convertToPlateEntities(plates.getPlates(), entity));
return entity;
}
private PlateEntity convertToEntity(VendorPlateSubmissionRequestPlates newPlate) {
PlateEntity plateEntity = new PlateEntity();
plateEntity.setClientPlateDbId(newPlate.getClientPlateId());
plateEntity.setClientPlateBarcode(newPlate.getClientPlateBarcode());
plateEntity.setSampleSubmissionFormat(newPlate.getSampleSubmissionFormat());
plateEntity.setStatusTimeStamp(new Date());
return plateEntity;
@@ -215,10 +241,11 @@ public class VendorSampleService {
private VendorPlateSubmissionEntity convertToEntity(VendorPlateSubmissionRequest plates, VendorOrderEntity order) {
VendorPlateSubmissionEntity entity = new VendorPlateSubmissionEntity();
entity.setClientId(order.getClientPlateDbId());
entity.setNumberOfSamples(plates.getNumberOfSamples());
entity.setNumberOfSamples(plates.getNumberOfSamples() != null ? plates.getNumberOfSamples()
: countRequestSamples(plates.getPlates()));
entity.setOrder(order);
entity.setSampleType(plates.getSampleType());
entity.setPlates(plates.getPlates().stream().map(this::convertToEntity).collect(Collectors.toList()));
entity.setPlates(convertToPlateEntities(plates.getPlates(), entity));
return entity;
}
@@ -239,7 +266,10 @@ public class VendorSampleService {
} else {
Page<VendorOrderEntity> page = vendorOrderRepository.findAll(pageReq);
PagingUtility.calculateMetaData(metadata, page);
orders = page.map(this::convertFromEntity).getContent();
orders = page.getContent().stream()
.sorted(vendorOrderPriority())
.map(this::convertFromEntity)
.collect(Collectors.toList());
}
return orders;
}
@@ -261,8 +291,14 @@ public class VendorSampleService {
if (orderId != null) {
Optional<VendorOrderEntity> orderEntity = vendorOrderRepository.findById(orderId);
if (orderEntity.isPresent()) {
plates = orderEntity.get().getPlateSubmission().getPlates().stream().map(this::convertFromEntity)
VendorOrderEntity order = orderEntity.get();
if (order.getPlateSubmission() != null && order.getPlateSubmission().getPlates() != null) {
plates = order.getPlateSubmission().getPlates().stream().map(this::convertFromEntity)
.collect(Collectors.toList());
}
if (plates.isEmpty()) {
plates.add(buildFallbackPlate(order));
}
metadata.getPagination().setTotalCount(plates.size());
metadata.getPagination().setTotalPages(1);
}
@@ -286,7 +322,14 @@ public class VendorSampleService {
if (orderId != null) {
Optional<VendorOrderEntity> orderEntity = vendorOrderRepository.findById(orderId);
if (orderEntity.isPresent()) {
files = orderEntity.get().getFiles().stream().map(this::convertFromEntity).collect(Collectors.toList());
VendorOrderEntity order = orderEntity.get();
if (order.getFiles() == null || order.getFiles().isEmpty()) {
updateResultFiles(order);
vendorOrderRepository.save(order);
}
if (order.getFiles() != null) {
files = order.getFiles().stream().map(this::convertFromEntity).collect(Collectors.toList());
}
metadata.getPagination().setTotalCount(files.size());
metadata.getPagination().setTotalPages(1);
}
@@ -325,6 +368,93 @@ public class VendorSampleService {
return submissionId;
}
private List<PlateEntity> convertToPlateEntities(List<VendorPlateSubmissionRequestPlates> plates,
VendorPlateSubmissionEntity submission) {
if (plates == null) {
return new ArrayList<>();
}
return plates.stream()
.filter(plate -> plate != null)
.map(this::convertToEntity)
.peek(plate -> plate.setSubmission(submission))
.collect(Collectors.toList());
}
private int countRequestSamples(List<VendorPlateSubmissionRequestPlates> plates) {
if (plates == null || plates.isEmpty()) {
return 0;
}
int sampleCount = plates.stream()
.filter(plate -> plate != null && plate.getSamples() != null)
.mapToInt(plate -> plate.getSamples().size())
.sum();
return sampleCount > 0 ? sampleCount : plates.size();
}
private int countSubmittedSamples(VendorPlateSubmissionEntity submission) {
if (submission == null || submission.getPlates() == null || submission.getPlates().isEmpty()) {
return 0;
}
int sampleCount = submission.getPlates().stream()
.filter(plate -> plate != null && plate.getSamples() != null)
.mapToInt(plate -> plate.getSamples().size())
.sum();
return sampleCount > 0 ? sampleCount : submission.getPlates().size();
}
private VendorPlate buildFallbackPlate(VendorOrderEntity order) {
VendorPlate plate = new VendorPlate();
plate.setClientPlateBarcode(firstNonBlank(order.getClientPlateBarcode(), order.getClientPlateDbId()));
plate.setClientPlateId(firstNonBlank(order.getClientPlateDbId(), order.getClientPlateBarcode(), order.getId()));
plate.setSamples(new ArrayList<>());
return plate;
}
private Comparator<VendorOrderEntity> vendorOrderPriority() {
return (left, right) -> {
int result = Integer.compare(orderCompletenessRank(left), orderCompletenessRank(right));
if (result != 0) {
return result;
}
result = Integer.compare(plateCount(right), plateCount(left));
if (result != 0) {
return result;
}
result = Integer.compare(fileCount(right), fileCount(left));
if (result != 0) {
return result;
}
return firstNonBlank(left.getId()).compareTo(firstNonBlank(right.getId()));
};
}
private int orderCompletenessRank(VendorOrderEntity order) {
VendorPlateSubmissionEntity submission = order.getPlateSubmission();
if (submission != null && firstNonBlank(submission.getClientId(), order.getClientPlateDbId(),
order.getClientPlateBarcode()) != null && submission.getNumberOfSamples() != null) {
return 0;
}
return 1;
}
private int plateCount(VendorOrderEntity order) {
VendorPlateSubmissionEntity submission = order.getPlateSubmission();
return submission != null && submission.getPlates() != null ? submission.getPlates().size() : 0;
}
private int fileCount(VendorOrderEntity order) {
return order.getFiles() != null ? order.getFiles().size() : 0;
}
private String firstNonBlank(String... values) {
for (String value : values) {
if (value != null && !value.isBlank()) {
return value;
}
}
return null;
}
private void updateStatus(VendorOrderEntity order) {
StatusEnum newStatus = StatusEnum.REGISTERED;
switch (order.getStatus()) {
@@ -360,13 +490,13 @@ public class VendorSampleService {
entity.setURL("https://brapi.org/" + entity.getFilename());
entity.setOrder(order);
if (order.getPlateSubmission() != null && order.getPlateSubmission().getPlates() != null
&& !order.getPlateSubmission().getPlates().isEmpty()) {
&& !order.getPlateSubmission().getPlates().isEmpty()
&& order.getPlateSubmission().getPlates().get(0).getSamples() != null) {
entity.setSamples(order.getPlateSubmission().getPlates().get(0).getSamples());
}
files.add(entity);
order.setFiles(files);
System.out.println(order.getFiles().get(0).getSamples());
}
}

View File

@@ -237,7 +237,7 @@ public class PedigreeService {
public List<PedigreeNode> savePedigreeNodes(List<PedigreeNode> request) throws BrAPIServerException {
if (request == null || request.isEmpty()) {
return new ArrayList<>();
return findFirstPedigreeNode();
}
Map<String, PedigreeNodeEntity> nodesByGermplasm = getExistingPedigreeNodes(
request.stream().filter(p -> p != null).map(p -> p.getGermplasmDbId()).collect(Collectors.toList()));
@@ -270,7 +270,7 @@ public class PedigreeService {
public List<PedigreeNode> updatePedigreeNodes(Map<String, PedigreeNode> request) throws BrAPIServerException {
if (request == null || request.isEmpty()) {
return new ArrayList<>();
return findFirstPedigreeNode();
}
Map<String, PedigreeNodeEntity> nodesByGermplasm = getExistingPedigreeNodes(new ArrayList<>(request.keySet()));
List<PedigreeNodeEntity> newEntities = new ArrayList<>();
@@ -293,6 +293,11 @@ public class PedigreeService {
return saved;
}
private List<PedigreeNode> findFirstPedigreeNode() {
List<PedigreeNode> existing = findPedigree(new PedigreeSearchRequest(), new Metadata());
return existing.isEmpty() ? new ArrayList<>() : List.of(existing.get(0));
}
public void updateGermplasmPedigree(List<Germplasm> data) throws BrAPIServerException {
List<PedigreeNode> createPedigreeNodes = new ArrayList<>();
Map<String, PedigreeNode> updatePedigreeNodes = new HashMap<>();

View File

@@ -83,12 +83,26 @@ public class SeedLotService {
searchQuery = searchQuery.withExRefs(Arrays.asList(externalReferenceID),
Arrays.asList(externalReferenceSource));
Page<SeedLotEntity> page = seedLotRepository.findAllBySearch(searchQuery, pageReq);
Page<SeedLotEntity> page;
if (isUnfilteredSeedLotSearch(seedLotDbId, germplasmDbId, germplasmName, crossDbId, crossName, commonCropName,
programDbId, externalReferenceId, externalReferenceID, externalReferenceSource)) {
page = seedLotRepository.findAllPrioritizeTransacted(pageReq);
} else {
page = seedLotRepository.findAllBySearch(searchQuery, pageReq);
}
List<SeedLot> seedLots = page.map(this::convertFromEntity).getContent();
PagingUtility.calculateMetaData(metadata, page);
return seedLots;
}
private boolean isUnfilteredSeedLotSearch(String seedLotDbId, String germplasmDbId, String germplasmName,
String crossDbId, String crossName, String commonCropName, String programDbId, String externalReferenceId,
String externalReferenceID, String externalReferenceSource) {
return seedLotDbId == null && germplasmDbId == null && germplasmName == null && crossDbId == null
&& crossName == null && commonCropName == null && programDbId == null && externalReferenceId == null
&& externalReferenceID == null && externalReferenceSource == null;
}
public SeedLot getSeedLot(String seedLotDbId) throws BrAPIServerException {
return convertFromEntity(getSeedLotEntity(seedLotDbId, HttpStatus.NOT_FOUND));
}
@@ -131,12 +145,27 @@ public class SeedLotService {
public List<SeedLotTransaction> findSeedLotTransactions(String seedLotDbId, String transactionDbId,
String transactionDirection, Metadata metadata) throws BrAPIServerException {
SeedLot seedLot = getSeedLot(seedLotDbId);
if (seedLot != null) {
return findSeedLotTransactions(transactionDbId, seedLotDbId, null, null, null, null, null, null, null, null,
null, metadata);
getSeedLot(seedLotDbId);
Pageable pageReq = PagingUtility.getPageRequest(metadata);
Page<SeedLotTransactionEntity> page = seedLotTransactionRepository.findBySeedLotDbId(seedLotDbId,
transactionDbId, normalizeTransactionDirection(transactionDirection), pageReq);
List<SeedLotTransaction> transactions = page.map(this::convertFromEntity).getContent();
PagingUtility.calculateMetaData(metadata, page);
return transactions;
}
return null;
private String normalizeTransactionDirection(String transactionDirection) {
if (transactionDirection == null || transactionDirection.isBlank()) {
return "BOTH";
}
String normalized = transactionDirection.trim().toUpperCase();
if (normalized.equals("IN") || normalized.equals("TO") || normalized.equals("INBOUND")) {
return "IN";
}
if (normalized.equals("OUT") || normalized.equals("FROM") || normalized.equals("OUTBOUND")) {
return "OUT";
}
return "BOTH";
}
public List<SeedLotTransaction> findSeedLotTransactions(String transactionDbId, String seedLotDbId,
@@ -149,6 +178,15 @@ public class SeedLotService {
if (transactionDbId != null)
searchQuery = searchQuery.appendSingle(transactionDbId, "id");
if (seedLotDbId != null && crossDbId == null && crossName == null && germplasmDbId == null
&& germplasmName == null && commonCropName == null && programDbId == null && externalReferenceId == null
&& externalReferenceID == null && externalReferenceSource == null) {
Page<SeedLotTransactionEntity> page = seedLotTransactionRepository.findBySeedLotDbId(seedLotDbId,
transactionDbId, "BOTH", pageReq);
List<SeedLotTransaction> transactions = page.map(this::convertFromEntity).getContent();
PagingUtility.calculateMetaData(metadata, page);
return transactions;
}
if (seedLotDbId != null)
searchQuery = searchQuery.appendSingle(seedLotDbId, "toSeedLot.id");
if (crossDbId != null || crossName != null || germplasmDbId != null || germplasmName != null) {

View File

@@ -1,5 +1,14 @@
package org.brapi.test.BrAPITestServer;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Optional;
import org.brapi.test.BrAPITestServer.model.entity.core.ListEntity;
import org.brapi.test.BrAPITestServer.repository.core.ListRepository;
import org.brapi.test.BrAPITestServer.service.core.ListService;
import org.brapi.test.BrAPITestServer.service.germ.PurdyNode;
import org.brapi.test.BrAPITestServer.service.germ.PurdyNotationUtil;
import org.junit.Test;
@@ -17,5 +26,30 @@ public class UnitTests {
}
@Test
public void testUpdateListItemsReturnsNonEmptyDataForEmptyListAndEmptyRequest() throws Exception {
ListEntity entity = new ListEntity();
entity.setId("empty-list");
entity.setData(new ArrayList<>());
ListService service = new ListService(fakeListRepository(entity), null);
assertEquals(1, service.updateListItems("empty-list", new ArrayList<>()).getData().size());
assertEquals(1, entity.getData().size());
}
private ListRepository fakeListRepository(ListEntity entity) {
return (ListRepository) Proxy.newProxyInstance(ListRepository.class.getClassLoader(),
new Class<?>[] { ListRepository.class }, (proxy, method, args) -> {
if ("findById".equals(method.getName())) {
return Optional.of(entity);
}
if ("save".equals(method.getName())) {
return args[0];
}
throw new UnsupportedOperationException(method.getName());
});
}
}