Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 151 additions & 47 deletions src/main/java/org/ohdsi/webapi/conceptset/ConceptSetComparison.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.ohdsi.webapi.conceptset;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
Expand All @@ -18,45 +13,154 @@
@JsonInclude(JsonInclude.Include.ALWAYS)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ConceptSetComparison {
@JsonProperty("conceptId")
public Long conceptId;

@JsonProperty("conceptIn1Only")
public Long conceptIn1Only;

@JsonProperty("conceptIn2Only")
public Long conceptIn2Only;

@JsonProperty("conceptIn1And2")
public Long conceptIn1And2;

@JsonProperty("conceptName")
public String conceptName;

@JsonProperty("standardConcept")
public String standardConcept;

@JsonProperty("invalidReason")
public String invalidReason;

@JsonProperty("conceptCode")
public String conceptCode;

@JsonProperty("domainId")
public String domainId;

@JsonProperty("vocabularyId")
public String vocabularyId;

@JsonProperty("validStartDate")
public Date validStartDate;

@JsonProperty("validEndDate")
public Date validEndDate;

@JsonProperty("conceptClassId")
public String conceptClassId;

@JsonProperty("nameMismatch")
public boolean nameMismatch;
}
@JsonProperty("isSourceCode")
public boolean isSourceCode;

@JsonProperty("conceptId")
public Long conceptId;

// Concept Set membership flags
@JsonProperty("conceptInCS1Only")
public Long conceptInCS1Only;

@JsonProperty("conceptInCS2Only")
public Long conceptInCS2Only;

@JsonProperty("conceptInCS1AndCS2")
public Long conceptInCS1AndCS2;

// Concept names from both vocabularies
@JsonProperty("vocab1ConceptName")
public String vocab1ConceptName;

@JsonProperty("vocab2ConceptName")
public String vocab2ConceptName;

// Standard concept from both vocabularies
@JsonProperty("vocab1StandardConcept")
public String vocab1StandardConcept;

@JsonProperty("vocab2StandardConcept")
public String vocab2StandardConcept;

@JsonProperty("standardConcept")
public String standardConcept;

// Invalid reason from both vocabularies
@JsonProperty("vocab1InvalidReason")
public String vocab1InvalidReason;

@JsonProperty("vocab2InvalidReason")
public String vocab2InvalidReason;

@JsonProperty("invalidReason")
public String invalidReason;

// Concept code from both vocabularies
@JsonProperty("vocab1ConceptCode")
public String vocab1ConceptCode;

@JsonProperty("vocab2ConceptCode")
public String vocab2ConceptCode;

@JsonProperty("conceptCode")
public String conceptCode;

// Domain ID from both vocabularies
@JsonProperty("vocab1DomainId")
public String vocab1DomainId;

@JsonProperty("vocab2DomainId")
public String vocab2DomainId;

@JsonProperty("domainId")
public String domainId;

// Vocabulary ID from both vocabularies
@JsonProperty("vocab1VocabularyId")
public String vocab1VocabularyId;

@JsonProperty("vocab2VocabularyId")
public String vocab2VocabularyId;

@JsonProperty("vocabularyId")
public String vocabularyId;

// Concept class ID from both vocabularies
@JsonProperty("vocab1ConceptClassId")
public String vocab1ConceptClassId;

@JsonProperty("vocab2ConceptClassId")
public String vocab2ConceptClassId;

@JsonProperty("conceptClassId")
public String conceptClassId;

// Valid start date from both vocabularies
@JsonProperty("vocab1ValidStartDate")
public Date vocab1ValidStartDate;

@JsonProperty("vocab2ValidStartDate")
public Date vocab2ValidStartDate;

@JsonProperty("validStartDate")
public Date validStartDate;

// Valid end date from both vocabularies
@JsonProperty("vocab1ValidEndDate")
public Date vocab1ValidEndDate;

@JsonProperty("vocab2ValidEndDate")
public Date vocab2ValidEndDate;

@JsonProperty("validEndDate")
public Date validEndDate;

// Mismatch flags for each field
@JsonProperty("nameMismatch")
public boolean nameMismatch;

@JsonProperty("standardConceptMismatch")
public boolean standardConceptMismatch;

@JsonProperty("invalidReasonMismatch")
public boolean invalidReasonMismatch;

@JsonProperty("conceptCodeMismatch")
public boolean conceptCodeMismatch;

@JsonProperty("domainIdMismatch")
public boolean domainIdMismatch;

@JsonProperty("vocabularyIdMismatch")
public boolean vocabularyIdMismatch;

@JsonProperty("conceptClassIdMismatch")
public boolean conceptClassIdMismatch;

@JsonProperty("validStartDateMismatch")
public boolean validStartDateMismatch;

@JsonProperty("validEndDateMismatch")
public boolean validEndDateMismatch;

// Vocabulary info for vocab 1
@JsonProperty("vocab1SourceKey")
public String vocab1SourceKey;

@JsonProperty("vocab1SourceName")
public String vocab1SourceName;

@JsonProperty("vocab1SourceVersion")
public String vocab1SourceVersion;

// Vocabulary info for vocab 2
@JsonProperty("vocab2SourceKey")
public String vocab2SourceKey;

@JsonProperty("vocab2SourceName")
public String vocab2SourceName;

@JsonProperty("vocab2SourceVersion")
public String vocab2SourceVersion;
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
*/
package org.ohdsi.webapi.conceptset;

import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import java.util.Date;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
Expand All @@ -27,7 +29,7 @@
*
* @author fdefalco
*/
public interface ConceptSetRepository extends CrudRepository<ConceptSet, Integer> {
public interface ConceptSetRepository extends CrudRepository<ConceptSet, Integer>, JpaSpecificationExecutor<ConceptSet> {
ConceptSet findById(Integer conceptSetId);

@Deprecated
Expand All @@ -44,4 +46,31 @@ public interface ConceptSetRepository extends CrudRepository<ConceptSet, Integer

@Query("SELECT DISTINCT cs FROM ConceptSet cs JOIN FETCH cs.tags t WHERE lower(t.name) in :tagNames")
List<ConceptSet> findByTags(@Param("tagNames") List<String> tagNames);

@Query("SELECT cs FROM ConceptSet cs WHERE " +
"(:createdFrom IS NULL OR cs.createdDate >= :createdFrom) AND " +
"(:createdTo IS NULL OR cs.createdDate <= :createdTo) AND " +
"(:updatedFrom IS NULL OR cs.modifiedDate >= :updatedFrom) AND " +
"(:updatedTo IS NULL OR cs.modifiedDate <= :updatedTo)")
List<ConceptSet> findByDateFilters(
@Param("createdFrom") Date createdFrom,
@Param("createdTo") Date createdTo,
@Param("updatedFrom") Date updatedFrom,
@Param("updatedTo") Date updatedTo
);

@Query("SELECT DISTINCT cs FROM ConceptSet cs " +
"JOIN cs.tags t " +
"WHERE t.id IN :tagIds AND " +
"(:createdFrom IS NULL OR cs.createdDate >= :createdFrom) AND " +
"(:createdTo IS NULL OR cs.createdDate <= :createdTo) AND " +
"(:updatedFrom IS NULL OR cs.modifiedDate >= :updatedFrom) AND " +
"(:updatedTo IS NULL OR cs.modifiedDate <= :updatedTo)")
List<ConceptSet> findByTagsAndDateFilters(
@Param("tagIds") List<Integer> tagIds,
@Param("createdFrom") Date createdFrom,
@Param("createdTo") Date createdTo,
@Param("updatedFrom") Date updatedFrom,
@Param("updatedTo") Date updatedTo
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.stereotype.Controller;

import javax.transaction.Transactional;
import org.springframework.transaction.annotation.Transactional;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;
import org.springframework.transaction.annotation.Transactional;
import javax.ws.rs.InternalServerErrorException;
import java.io.ByteArrayOutputStream;
import java.io.File;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@

import javax.annotation.PostConstruct;
import javax.net.ssl.HttpsURLConnection;
import javax.transaction.Transactional;
import org.springframework.transaction.annotation.Transactional;
import javax.ws.rs.InternalServerErrorException;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.client.Entity;
Expand Down
45 changes: 45 additions & 0 deletions src/main/java/org/ohdsi/webapi/job/JobArtifactController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.ohdsi.webapi.job;

import org.ohdsi.webapi.job.artifact.JobArtifactService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

/**
* Controller for managing job execution artifacts (reports, results, etc.)
*/
@Path("/job")
@Component
public class JobArtifactController {

private static final Logger logger = LoggerFactory.getLogger(JobArtifactController.class);

private final JobArtifactService artifactService;

public JobArtifactController(JobArtifactService artifactService) {
this.artifactService = artifactService;
}

/**
* Download artifact for a specific job execution
*
* @param executionId the job execution ID
* @return Response containing the artifact file
*/
@GET
@Path("/{executionId}/artifact")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Transactional
public Response downloadArtifact(@PathParam("executionId") Long executionId) {
logger.info("Artifact download requested for job execution ID: {}", executionId);
return artifactService.downloadArtifact(executionId);
}
}
15 changes: 13 additions & 2 deletions src/main/java/org/ohdsi/webapi/job/JobExecutionResource.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,11 @@ public class JobExecutionResource {

@JsonProperty("ownerType")
private JobOwnerType ownerType;

public JobExecutionResource() {

@JsonProperty("hasArtifact")
private Boolean hasArtifact;

public JobExecutionResource() {
//needed for json deserialization
}

Expand Down Expand Up @@ -129,4 +132,12 @@ public JobOwnerType getOwnerType() {
public void setOwnerType(JobOwnerType ownerType) {
this.ownerType = ownerType;
}

public Boolean getHasArtifact() {
return hasArtifact;
}

public void setHasArtifact(Boolean hasArtifact) {
this.hasArtifact = hasArtifact;
}
}
Loading
Loading