diff --git a/src/main/java/org/tdl/vireo/controller/SubmissionController.java b/src/main/java/org/tdl/vireo/controller/SubmissionController.java index c521b54f96..cae96f5748 100644 --- a/src/main/java/org/tdl/vireo/controller/SubmissionController.java +++ b/src/main/java/org/tdl/vireo/controller/SubmissionController.java @@ -108,7 +108,8 @@ public ApiResponse updateSubmission(@ApiVariable("submissionId") Long submission @ApiMapping("/query/{page}/{size}") @Auth(role = "MANAGER") public ApiResponse querySubmission(@ApiCredentials Credentials credentials, @ApiVariable Integer page, @ApiVariable Integer size, @ApiModel List submissionListColumns) { - return new ApiResponse(SUCCESS, submissionRepo.pageableDynamicSubmissionQuery(credentials, submissionListColumns, new PageRequest(page, size))); + User user = userRepo.findByEmail(credentials.getEmail()); + return new ApiResponse(SUCCESS, submissionRepo.pageableDynamicSubmissionQuery(user.getActiveFilter(), submissionListColumns, new PageRequest(page, size))); } @ApiMapping("/all-submission-state") @@ -124,7 +125,7 @@ public ApiResponse batchUpdateSubmissionStates(@ApiCredentials Credentials crede User user = userRepo.findByEmail(credentials.getEmail()); - submissionRepo.dynamicSubmissionQuery(credentials, user.getSubmissionViewColumns()).forEach(sub -> { + submissionRepo.batchDynamicSubmissionQuery(user.getActiveFilter(), user.getSubmissionViewColumns()).forEach(sub -> { sub.setState(submissionState); submissionRepo.save(sub); }); @@ -140,7 +141,7 @@ public ApiResponse batchAssignTo(@ApiCredentials Credentials credentials, @ApiMo User user = userRepo.findByEmail(credentials.getEmail()); - submissionRepo.dynamicSubmissionQuery(credentials, user.getSubmissionViewColumns()).forEach(sub -> { + submissionRepo.batchDynamicSubmissionQuery(user.getActiveFilter(), user.getSubmissionViewColumns()).forEach(sub -> { sub.setAssignee(assignee); submissionRepo.save(sub); }); diff --git a/src/main/java/org/tdl/vireo/controller/SubmissionListController.java b/src/main/java/org/tdl/vireo/controller/SubmissionListController.java index bb3177ba3b..65cf888db1 100644 --- a/src/main/java/org/tdl/vireo/controller/SubmissionListController.java +++ b/src/main/java/org/tdl/vireo/controller/SubmissionListController.java @@ -11,9 +11,10 @@ import org.springframework.transaction.annotation.Transactional; import org.tdl.vireo.model.FilterCriterion; import org.tdl.vireo.model.NamedSearchFilter; +import org.tdl.vireo.model.NamedSearchFilterGroup; import org.tdl.vireo.model.SubmissionListColumn; import org.tdl.vireo.model.User; -import org.tdl.vireo.model.repo.FilterCriterionRepo; +import org.tdl.vireo.model.repo.NamedSearchFilterGroupRepo; import org.tdl.vireo.model.repo.NamedSearchFilterRepo; import org.tdl.vireo.model.repo.SubmissionListColumnRepo; import org.tdl.vireo.model.repo.UserRepo; @@ -35,293 +36,303 @@ @ApiMapping("/submission-list") public class SubmissionListController { - @Autowired - private SubmissionListColumnRepo submissionListColumnRepo; - - @Autowired - private UserRepo userRepo; - - @Autowired - private DefaultSubmissionListColumnService defaultSubmissionListColumnService; - - @Autowired - private SimpMessagingTemplate simpMessagingTemplate; - - @Autowired - private FilterCriterionRepo filterCriterionRepo; - - @Autowired - private NamedSearchFilterRepo namedSearchFilterRepo; - - @ApiMapping("/all-columns") - @Auth(role = "STUDENT") - @Transactional - public ApiResponse getSubmissionViewColumns() { - return new ApiResponse(SUCCESS, submissionListColumnRepo.findAll()); - } - - @Transactional - @ApiMapping("/columns-by-user") - @Auth(role = "STUDENT") - public ApiResponse getSubmissionViewColumnsByUser(@ApiCredentials Credentials credentials) { - User user = userRepo.findByEmail(credentials.getEmail()); - return new ApiResponse(SUCCESS, user.getSubmissionViewColumns()); - } - - @Transactional - @ApiMapping("/filter-columns-by-user") - @Auth(role = "STUDENT") - public ApiResponse getFilterColumnsByUser(@ApiCredentials Credentials credentials) { - User user = userRepo.findByEmail(credentials.getEmail()); - return new ApiResponse(SUCCESS, user.getFilterColumns()); - } - - @Transactional - @ApiMapping("/pagesize-by-user") - @Auth(role = "STUDENT") - public ApiResponse getSubmissionViewPageSizeByUser(@ApiCredentials Credentials credentials) { - User user = userRepo.findByEmail(credentials.getEmail()); - return new ApiResponse(SUCCESS, user.getPageSize()); - } - - @Transactional - @ApiMapping("/update-user-columns/{pageSize}") - @Auth(role = "STUDENT") - public ApiResponse updateUserSubmissionViewColumns(@ApiCredentials Credentials credentials, @ApiVariable Integer pageSize, @ApiModel List submissionViewColumns) { - User user = userRepo.findByEmail(credentials.getEmail()); - user.setPageSize(pageSize); - user.setSubmissionViewColumns(submissionViewColumns); - user = userRepo.save(user); + @Autowired + private SubmissionListColumnRepo submissionListColumnRepo; + + @Autowired + private UserRepo userRepo; + + @Autowired + private DefaultSubmissionListColumnService defaultSubmissionListColumnService; + + @Autowired + private SimpMessagingTemplate simpMessagingTemplate; + + @Autowired + private NamedSearchFilterRepo filterCriterionRepo; + + @Autowired + private NamedSearchFilterGroupRepo namedSearchFilterGroupRepo; + + @ApiMapping("/all-columns") + @Auth(role = "STUDENT") + @Transactional + public ApiResponse getSubmissionViewColumns() { + return new ApiResponse(SUCCESS, submissionListColumnRepo.findAll()); + } + + @Transactional + @ApiMapping("/columns-by-user") + @Auth(role = "STUDENT") + public ApiResponse getSubmissionViewColumnsByUser(@ApiCredentials Credentials credentials) { + User user = userRepo.findByEmail(credentials.getEmail()); + return new ApiResponse(SUCCESS, user.getSubmissionViewColumns()); + } - return new ApiResponse(SUCCESS, user.getSubmissionViewColumns()); - } + @Transactional + @ApiMapping("/filter-columns-by-user") + @Auth(role = "STUDENT") + public ApiResponse getFilterColumnsByUser(@ApiCredentials Credentials credentials) { + User user = userRepo.findByEmail(credentials.getEmail()); + return new ApiResponse(SUCCESS, user.getFilterColumns()); + } - @Transactional - @ApiMapping("/reset-user-columns") - @Auth(role = "STUDENT") - public ApiResponse resetUserSubmissionViewColumns(@ApiCredentials Credentials credentials) { - User user = userRepo.findByEmail(credentials.getEmail()); - user.setSubmissionViewColumns(defaultSubmissionListColumnService.getDefaultSubmissionListColumns()); - user = userRepo.save(user); - return new ApiResponse(SUCCESS, user.getSubmissionViewColumns()); - } + @Transactional + @ApiMapping("/pagesize-by-user") + @Auth(role = "STUDENT") + public ApiResponse getSubmissionViewPageSizeByUser(@ApiCredentials Credentials credentials) { + User user = userRepo.findByEmail(credentials.getEmail()); + return new ApiResponse(SUCCESS, user.getPageSize()); + } - @Transactional - @ApiMapping("/update-user-filter-columns") - @Auth(role = "STUDENT") - public ApiResponse updateUserFilterColumns(@ApiCredentials Credentials credentials, @ApiModel List filterColumns) { - User user = userRepo.findByEmail(credentials.getEmail()); - user.setFilterColumns(filterColumns); - user = userRepo.save(user); - - return new ApiResponse(SUCCESS, user.getFilterColumns()); - } + @Transactional + @ApiMapping("/update-user-columns/{pageSize}") + @Auth(role = "STUDENT") + public ApiResponse updateUserSubmissionViewColumns(@ApiCredentials Credentials credentials, @ApiVariable Integer pageSize, @ApiModel List submissionViewColumns) { + User user = userRepo.findByEmail(credentials.getEmail()); + user.setPageSize(pageSize); + user.setSubmissionViewColumns(submissionViewColumns); + user = userRepo.save(user); - @ApiMapping("/set-active-filter") - @Auth(role = "MANAGER") - public ApiResponse setActiveFilter(@ApiCredentials Credentials credentials, @ApiValidatedModel NamedSearchFilter filter) { + return new ApiResponse(SUCCESS, user.getSubmissionViewColumns()); + } - User user = userRepo.findByEmail(credentials.getEmail()); + @Transactional + @ApiMapping("/reset-user-columns") + @Auth(role = "STUDENT") + public ApiResponse resetUserSubmissionViewColumns(@ApiCredentials Credentials credentials) { + User user = userRepo.findByEmail(credentials.getEmail()); + user.setSubmissionViewColumns(defaultSubmissionListColumnService.getDefaultSubmissionListColumns()); + user = userRepo.save(user); + return new ApiResponse(SUCCESS, user.getSubmissionViewColumns()); + } - List ids = new ArrayList(); + @Transactional + @ApiMapping("/update-user-filter-columns") + @Auth(role = "STUDENT") + public ApiResponse updateUserFilterColumns(@ApiCredentials Credentials credentials, + @ApiModel List filterColumns) { + User user = userRepo.findByEmail(credentials.getEmail()); + user.setFilterColumns(filterColumns); + user = userRepo.save(user); - user.getActiveFilter().getFilterCriteria().forEach(filterCriterion -> { - ids.add(filterCriterion.getId()); - }); + return new ApiResponse(SUCCESS, user.getFilterColumns()); + } - user.getActiveFilter().getFilterCriteria().clear(); + @ApiMapping("/set-active-filter") + @Auth(role = "MANAGER") + public ApiResponse setActiveFilter(@ApiCredentials Credentials credentials, @ApiValidatedModel NamedSearchFilterGroup namedSearchFilterGroup) { - user = userRepo.save(user); + User user = userRepo.findByEmail(credentials.getEmail()); - ids.forEach(id -> { - filterCriterionRepo.delete(id); - }); - - NamedSearchFilter activeFilter = user.getActiveFilter(); - activeFilter = namedSearchFilterRepo.clone(activeFilter, filter); - - if (activeFilter.getColumnsFlag()) { - user.getSubmissionViewColumns().clear(); - user.getSubmissionViewColumns().addAll(user.getActiveFilter().getSavedColumns()); - } - - user = userRepo.save(user); - - simpMessagingTemplate.convertAndSend("/channel/active-filters/" + user.getActiveFilter().getId(), new ApiResponse(SUCCESS, user.getActiveFilter())); - - return new ApiResponse(SUCCESS); - } - - @ApiMapping("/active-filters") - @Auth(role = "MANAGER") - public ApiResponse getActiveFilters(@ApiCredentials Credentials credentials) { - User user = userRepo.findByEmail(credentials.getEmail()); - - if (user.getActiveFilter().getFilterCriteria().size() < 1) { - - NamedSearchFilter activeFilter = user.getActiveFilter(); - FilterCriterion filterCriterionOne = filterCriterionRepo.create(submissionListColumnRepo.findByTitle("First Name")); - filterCriterionOne.setName("First Name"); - filterCriterionOne.addFilter("Jeremy"); - filterCriterionOne.addFilter("Jack"); + List ids = new ArrayList(); - activeFilter.addFilterCriterion(filterCriterionOne); + user.getActiveFilter().getNamedSearchFilters().forEach(namedSearchFilter -> { + ids.add(namedSearchFilter.getId()); + }); - FilterCriterion filterCriterionTwo = filterCriterionRepo.create(submissionListColumnRepo.findByTitle("Last Name")); - filterCriterionTwo.setName("Last Name"); - filterCriterionTwo.addFilter("Huff"); - filterCriterionTwo.addFilter("Daniels"); + user.getActiveFilter().getNamedSearchFilters().clear(); - activeFilter.addFilterCriterion(filterCriterionTwo); + user = userRepo.save(user); - userRepo.save(user); - } + ids.forEach(id -> { + filterCriterionRepo.delete(id); + }); - return new ApiResponse(SUCCESS, user.getActiveFilter()); - } + NamedSearchFilterGroup activeFilter = user.getActiveFilter(); + activeFilter = namedSearchFilterGroupRepo.clone(activeFilter, namedSearchFilterGroup); - @ApiMapping("/saved-filters") - @Auth(role = "MANAGER") - public ApiResponse getSavedFilters(@ApiCredentials Credentials credentials) { - User user = userRepo.findByEmail(credentials.getEmail()); + if (activeFilter.getColumnsFlag()) { + user.getSubmissionViewColumns().clear(); + user.getSubmissionViewColumns().addAll(user.getActiveFilter().getSavedColumns()); + } - if (user.getActiveFilter().getFilterCriteria().size() < 1) { + user = userRepo.save(user); - NamedSearchFilter activeFilter = user.getActiveFilter(); - FilterCriterion filterCriterionOne = filterCriterionRepo.create(submissionListColumnRepo.findByTitle("First Name")); - filterCriterionOne.setName("First Name"); - filterCriterionOne.addFilter("Jeremy"); - filterCriterionOne.addFilter("Jack"); + simpMessagingTemplate.convertAndSend("/channel/active-filters/" + user.getActiveFilter().getId(), + new ApiResponse(SUCCESS, user.getActiveFilter())); + + return new ApiResponse(SUCCESS); - activeFilter.addFilterCriterion(filterCriterionOne); + } - FilterCriterion filterCriterionTwo = filterCriterionRepo.create(submissionListColumnRepo.findByTitle("Last Name")); - filterCriterionTwo.setName("Last Name"); - filterCriterionTwo.addFilter("Huff"); - filterCriterionTwo.addFilter("Daniels"); + @ApiMapping("/active-filters") + @Auth(role = "MANAGER") + public ApiResponse getActiveFilters(@ApiCredentials Credentials credentials) { - activeFilter.addFilterCriterion(filterCriterionTwo); + User user = userRepo.findByEmail(credentials.getEmail()); - userRepo.save(user); - } + return new ApiResponse(SUCCESS, user.getActiveFilter()); - return new ApiResponse(SUCCESS, user.getActiveFilter()); - } + } - @ApiMapping("/remove-saved-filter") - @Auth(role = "MANAGER") - public ApiResponse removeSavedFilter(@ApiCredentials Credentials credentials, @ApiModel NamedSearchFilter savedFilter) { - User user = userRepo.findByEmail(credentials.getEmail()); - user.getSavedFilters().remove(savedFilter); - userRepo.save(user); - namedSearchFilterRepo.delete(savedFilter.getId()); + @ApiMapping("/saved-filters") + @Auth(role = "MANAGER") + public ApiResponse getSavedFilters(@ApiCredentials Credentials credentials) { - return getSavedFilters(credentials); - } + User user = userRepo.findByEmail(credentials.getEmail()); - @ApiMapping("/remove-filter-criterion") - @Auth(role = "MANAGER") - public ApiResponse clearFilterCriterion(@ApiCredentials Credentials credentials, @ApiData JsonNode data) { + return new ApiResponse(SUCCESS, user.getActiveFilter()); - String criterionName = data.get("criterionName").asText(); - String filterValue = data.get("filterValue").asText(); + } - User user = userRepo.findByEmail(credentials.getEmail()); + @ApiMapping("/remove-saved-filter") + @Auth(role = "MANAGER") + public ApiResponse removeSavedFilter(@ApiCredentials Credentials credentials, + @ApiModel NamedSearchFilter savedFilter) { + User user = userRepo.findByEmail(credentials.getEmail()); + user.getSavedFilters().remove(savedFilter); + userRepo.save(user); + namedSearchFilterGroupRepo.delete(savedFilter.getId()); - NamedSearchFilter activeFilter = user.getActiveFilter(); + return getSavedFilters(credentials); + } - for (FilterCriterion criterion : activeFilter.getFilterCriteria()) { - if (criterion.getName().equals(criterionName)) { - for (String filter : criterion.getFilters()) { - if (filter.equals(filterValue)) { - criterion.removeFilter(filterValue); - if (criterion.getFilters().size() == 0) { - activeFilter.removeFilterCriterion(criterion); - } - break; - } - } - break; - } - } + @ApiMapping("/add-filter-criterion") + @Auth(role = "MANAGER") + public ApiResponse addFilterCriterion(@ApiCredentials Credentials credentials, @ApiData JsonNode data) { - user = userRepo.save(user); + String criterionName = data.get("criterionName").asText(); + String filterValue = data.get("filterValue").asText(); - simpMessagingTemplate.convertAndSend("/channel/active-filters/" + user.getActiveFilter().getId(), new ApiResponse(SUCCESS, user.getActiveFilter())); + JsonNode filterGlossNode = data.get("filterGloss"); + String filterGloss = null; + if (filterGlossNode != null) + filterGloss = filterGlossNode.asText(); - return new ApiResponse(SUCCESS); - } + User user = userRepo.findByEmail(credentials.getEmail()); - @ApiMapping("/clear-filter-criteria") - @Auth(role = "MANAGER") - public ApiResponse clearFilterCriteria(@ApiCredentials Credentials credentials) { + NamedSearchFilterGroup activeFilter = user.getActiveFilter(); - User user = userRepo.findByEmail(credentials.getEmail()); + NamedSearchFilter namedSearchFilter = null; - user.getActiveFilter().getFilterCriteria().clear(); + for (NamedSearchFilter criterion : activeFilter.getNamedSearchFilters()) { + if (criterion.getName().equals(criterionName)) { + namedSearchFilter = criterion; + break; + } + } - userRepo.save(user); + if (namedSearchFilter == null) + namedSearchFilter = filterCriterionRepo.create(submissionListColumnRepo.findByTitle(criterionName)); - user.getActiveFilter().getFilterCriteria().forEach(filterCriterion -> { - filterCriterionRepo.delete(filterCriterion); - }); + namedSearchFilter.addFilter(filterValue, filterGloss); - simpMessagingTemplate.convertAndSend("/channel/active-filters/" + user.getActiveFilter().getId(), new ApiResponse(SUCCESS, user.getActiveFilter())); + user.getActiveFilter().addFilterCriterion(namedSearchFilter); - return new ApiResponse(SUCCESS); - } + user = userRepo.save(user); - @ApiMapping("/all-saved-filter-criteria") - @Auth(role = "MANAGER") - public ApiResponse getAllSaveFilterCriteria(@ApiCredentials Credentials credentials) { + simpMessagingTemplate.convertAndSend("/channel/active-filters/" + user.getActiveFilter().getId(), + new ApiResponse(SUCCESS, user.getActiveFilter())); - User user = userRepo.findByEmail(credentials.getEmail()); + return new ApiResponse(SUCCESS); + } - List userSavedFilters = user.getSavedFilters(); - List publicSavedFilters = namedSearchFilterRepo.findByPublicFlagTrue(); + @ApiMapping("/remove-filter-criterion/{namedSearchFilterName}") + @Auth(role = "MANAGER") + public ApiResponse removeFilterCriterion(@ApiCredentials Credentials credentials, + @ApiVariable String namedSearchFilterName, @ApiModel FilterCriterion filterCriterion) { - List allSavedFilters = new ArrayList(); - allSavedFilters.addAll(userSavedFilters); - allSavedFilters.addAll(publicSavedFilters); + User user = userRepo.findByEmail(credentials.getEmail()); - return new ApiResponse(SUCCESS, userSavedFilters); - } + NamedSearchFilterGroup activeFilter = user.getActiveFilter(); - @ApiMapping("/save-filter-criteria") - @Auth(role = "MANAGER") - public ApiResponse saveFilterCriteria(@ApiCredentials Credentials credentials, @ApiValidatedModel NamedSearchFilter namedSearchFilter) { + for (NamedSearchFilter namedSearchFilter : activeFilter.getNamedSearchFilters()) { + if (namedSearchFilter.getName().equals(namedSearchFilterName)) { + for (FilterCriterion fc : namedSearchFilter.getFilters()) { + if (fc.getValue().equals(filterCriterion.getValue()) + && fc.getGloss().equals(filterCriterion.getGloss())) { + namedSearchFilter.removeFilter(fc); + if (namedSearchFilter.getFilters().size() == 0) { + activeFilter.removeNamedSearchFilter(namedSearchFilter); + } + break; + } + } + break; + } + } - User user = userRepo.findByEmail(credentials.getEmail()); + user = userRepo.save(user); - NamedSearchFilter existingFilter = namedSearchFilterRepo.findByNameAndPublicFlagTrue(namedSearchFilter.getName()); + simpMessagingTemplate.convertAndSend("/channel/active-filters/" + user.getActiveFilter().getId(), + new ApiResponse(SUCCESS, user.getActiveFilter())); - if (existingFilter != null) { - existingFilter = namedSearchFilterRepo.clone(existingFilter, namedSearchFilter); - user = userRepo.findByEmail(credentials.getEmail()); + return new ApiResponse(SUCCESS); + } - } else { + @ApiMapping("/clear-filter-criteria") + @Auth(role = "MANAGER") + public ApiResponse clearFilterCriteria(@ApiCredentials Credentials credentials) { - boolean foundFilter = false; + User user = userRepo.findByEmail(credentials.getEmail()); - for (NamedSearchFilter filter : user.getSavedFilters()) { - if (filter.getName().equals(namedSearchFilter.getName())) { - filter.getFilterCriteria().clear(); - filter = namedSearchFilterRepo.clone(filter, namedSearchFilter); - foundFilter = true; - break; + user.getActiveFilter().getNamedSearchFilters().clear(); - } - } + userRepo.save(user); - if (!foundFilter) { - user.getSavedFilters().add(namedSearchFilterRepo.createFromFilter(namedSearchFilter)); - } + user.getActiveFilter().getNamedSearchFilters().forEach(namedSearchFilter -> { + filterCriterionRepo.delete(namedSearchFilter); + }); - } + simpMessagingTemplate.convertAndSend("/channel/active-filters/" + user.getActiveFilter().getId(), + new ApiResponse(SUCCESS, user.getActiveFilter())); - userRepo.save(user); + return new ApiResponse(SUCCESS); + } - return new ApiResponse(SUCCESS); - } + @ApiMapping("/all-saved-filter-criteria") + @Auth(role = "MANAGER") + public ApiResponse getAllSaveFilterCriteria(@ApiCredentials Credentials credentials) { + + User user = userRepo.findByEmail(credentials.getEmail()); + + List userSavedFilters = user.getSavedFilters(); + List publicSavedFilters = namedSearchFilterGroupRepo.findByPublicFlagTrue(); + + List allSavedFilters = new ArrayList(); + allSavedFilters.addAll(userSavedFilters); + allSavedFilters.addAll(publicSavedFilters); + + return new ApiResponse(SUCCESS, userSavedFilters); + } + + @ApiMapping("/save-filter-criteria") + @Auth(role = "MANAGER") + public ApiResponse saveFilterCriteria(@ApiCredentials Credentials credentials, @ApiValidatedModel NamedSearchFilterGroup namedSearchFilterGroup) { + + User user = userRepo.findByEmail(credentials.getEmail()); + + NamedSearchFilterGroup existingFilter = namedSearchFilterGroupRepo + .findByNameAndPublicFlagTrue(namedSearchFilterGroup.getName()); + + if (existingFilter != null) { + existingFilter = namedSearchFilterGroupRepo.clone(existingFilter, namedSearchFilterGroup); + user = userRepo.findByEmail(credentials.getEmail()); + + } else { + + boolean foundFilter = false; + + for (NamedSearchFilterGroup filter : user.getSavedFilters()) { + if (filter.getName().equals(namedSearchFilterGroup.getName())) { + filter.getNamedSearchFilters().clear(); + filter = namedSearchFilterGroupRepo.clone(filter, namedSearchFilterGroup); + foundFilter = true; + break; + + } + } + + if (!foundFilter) { + user.getSavedFilters().add(namedSearchFilterGroupRepo.createFromFilter(namedSearchFilterGroup)); + } + + } + + userRepo.save(user); + + return new ApiResponse(SUCCESS); + } } diff --git a/src/main/java/org/tdl/vireo/model/FilterCriterion.java b/src/main/java/org/tdl/vireo/model/FilterCriterion.java index ea5b9de9d2..78739fabb7 100644 --- a/src/main/java/org/tdl/vireo/model/FilterCriterion.java +++ b/src/main/java/org/tdl/vireo/model/FilterCriterion.java @@ -1,99 +1,40 @@ package org.tdl.vireo.model; -import static javax.persistence.CascadeType.MERGE; -import static javax.persistence.CascadeType.REFRESH; -import static javax.persistence.FetchType.EAGER; +import javax.persistence.Embeddable; -import java.util.HashSet; -import java.util.Set; - -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.ManyToOne; - -import edu.tamu.framework.model.BaseEntity; - -@Entity -public class FilterCriterion extends BaseEntity { +@Embeddable +public class FilterCriterion { - private String name; - - @ManyToOne(cascade = { REFRESH, MERGE }, fetch = EAGER, optional = true) - private SubmissionListColumn submissionListColumn; - - @ElementCollection(fetch = EAGER) - private Set filters; - - @Column(nullable = false) - private Boolean allColumnSearch; - - public FilterCriterion() { - setFilters(new HashSet()); - setAllColumnSearch(true); - } - - public FilterCriterion(SubmissionListColumn submissionListColumn) { - this(); - setAllColumnSearch(false); - setSubmissionListColumn(submissionListColumn); - } - - /** - * @return the submissionListColumn - */ - public SubmissionListColumn getSubmissionListColumn() { - return submissionListColumn; - } + private String value; + private String gloss; - /** - * @param submissionListColumn the submissionListColumn to set - */ - public void setSubmissionListColumn(SubmissionListColumn submissionListColumn) { - this.submissionListColumn = submissionListColumn; - if(this.submissionListColumn != null) { - setAllColumnSearch(false); - } - else { - setAllColumnSearch(true); - } - } - /** - * @return the filters - */ - public Set getFilters() { - return filters; - } - - /** - * @param filterStrings the filterStrings to set - */ - public void setFilters(Set filters) { - this.filters = filters; - } - - public void addFilter(String filter) { - filters.add(filter); - } - - public void removeFilter(String filter) { - filters.remove(filter); - } - - public Boolean getAllColumnSearch() { - return allColumnSearch; - } - - public void setAllColumnSearch(Boolean allColumnSearch) { - this.allColumnSearch = allColumnSearch; - } + public FilterCriterion() {} + + public FilterCriterion(String value, String gloss) { + setValue(value); + setGloss(gloss); + } - public String getName() { - return name; + public FilterCriterion(String value) { + setValue(value); + setGloss(value); } + - public void setName(String name) { - this.name = name; + public String getValue() { + return value; } - + + public void setValue(String value) { + this.value = value; + } + + public String getGloss() { + return gloss; + } + + public void setGloss(String gloss) { + this.gloss = gloss; + } + } diff --git a/src/main/java/org/tdl/vireo/model/NamedSearchFilter.java b/src/main/java/org/tdl/vireo/model/NamedSearchFilter.java index 409efe35a0..c744d0225a 100644 --- a/src/main/java/org/tdl/vireo/model/NamedSearchFilter.java +++ b/src/main/java/org/tdl/vireo/model/NamedSearchFilter.java @@ -4,184 +4,120 @@ import static javax.persistence.CascadeType.REFRESH; import static javax.persistence.FetchType.EAGER; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import javax.persistence.Column; +import javax.persistence.ElementCollection; import javax.persistence.Entity; -import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OrderColumn; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; - -import org.hibernate.annotations.Fetch; -import org.hibernate.annotations.FetchMode; -import org.tdl.vireo.model.validation.NamedSearchFilterValidator; - -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.JsonIdentityReference; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; import edu.tamu.framework.model.BaseEntity; @Entity -@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "user_id", "name" }) }) public class NamedSearchFilter extends BaseEntity { - - @ManyToOne(cascade = { REFRESH, MERGE }, optional = false) - @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, scope = User.class, property = "id") - @JsonIdentityReference(alwaysAsId = true) - private User user; - - @Column(nullable = true) - private String name; - - @Column(nullable = false) - private Boolean publicFlag; - + + private String name; + + @ManyToOne(cascade = { REFRESH, MERGE }, fetch = EAGER, optional = true) + private SubmissionListColumn submissionListColumn; + + @ElementCollection(fetch = EAGER) + private Set filterCriteria; + @Column(nullable = false) - private Boolean columnsFlag; - - @Column(nullable = false) - private Boolean umiRelease; - - @ManyToMany(cascade = { REFRESH, MERGE }, fetch = EAGER) - @OrderColumn - private List savedColumns; - - @Fetch(FetchMode.SELECT) - @OneToMany(cascade = { REFRESH, MERGE }, fetch = EAGER, orphanRemoval = true) - private List filterCriteria; - + private Boolean allColumnSearch; + public NamedSearchFilter() { - setPublicFlag(false); - setColumnsFlag(false); - setUmiRelease(false); - setFilterCriteria(new ArrayList()); - setSavedColumns(new ArrayList()); - setModelValidator(new NamedSearchFilterValidator()); - } - - /** - * @return the user - */ - public User getUser() { - return user; + setFilters(new HashSet()); + setAllColumnSearch(true); } - - /** - * @param user - * the user to set - */ - public void setUser(User user) { - this.user = user; + + public NamedSearchFilter(SubmissionListColumn submissionListColumn) { + this(); + setAllColumnSearch(false); + setSubmissionListColumn(submissionListColumn); } - + /** - * @return the name + * @return the submissionListColumn */ - public String getName() { - return name; + public SubmissionListColumn getSubmissionListColumn() { + return submissionListColumn; } /** - * @param name - * the name to set + * @param submissionListColumn the submissionListColumn to set */ - public void setName(String name) { - this.name = name; - } - - /** - * @return the publicFlag - */ - public Boolean getPublicFlag() { - return publicFlag; - } - - /** - * @param publicFlag - * the publicFlag to set - */ - public void setPublicFlag(Boolean publicFlag) { - this.publicFlag = publicFlag; - } - - public Boolean getColumnsFlag() { - return columnsFlag; - } - - public void setColumnsFlag(Boolean columnsFlag) { - this.columnsFlag = columnsFlag; - } - - /** - * @return the umiRelease - */ - public Boolean getUmiRelease() { - return umiRelease; - } - - public List getSavedColumns() { - return savedColumns; - } - - public void setSavedColumns(List savedColumns) { - this.savedColumns = savedColumns; - } - - public void addSavedColumn(SubmissionListColumn submissionListColumn) { - if (!savedColumns.contains(submissionListColumn)) { - savedColumns.add(submissionListColumn); + public void setSubmissionListColumn(SubmissionListColumn submissionListColumn) { + this.submissionListColumn = submissionListColumn; + if(this.submissionListColumn != null) { + setAllColumnSearch(false); + } + else { + setAllColumnSearch(true); } } - - public void removeSavedColumn(SubmissionListColumn submissionListColumn) { - savedColumns.remove(submissionListColumn); - } - - /** - * @param umiRelease - * the umiRelease to set - */ - public void setUmiRelease(Boolean umiRelease) { - this.umiRelease = umiRelease; - } - /** - * @return the filterCriteria + * @return the filters */ - public List getFilterCriteria() { + public Set getFilters() { return filterCriteria; } /** - * @param filterCriteria - * the filterCriteria to set + * @param filterStrings the filterStrings to set */ - public void setFilterCriteria(List filterCriteria) { + public void setFilters(Set filterCriteria) { this.filterCriteria = filterCriteria; } - - public void addFilterCriterion(FilterCriterion filterCriterion) { - if (!filterCriteria.contains(filterCriterion)) { - filterCriteria.add(filterCriterion); - } - } - - public void removeFilterCriterion(FilterCriterion filterCriterion) { - filterCriteria.remove(filterCriterion); - } - - public FilterCriterion getFilterCriterion(Long criteriaId) { - for (FilterCriterion filterCriterion : filterCriteria) { - if (filterCriterion.getId() == criteriaId) { - return filterCriterion; - } - } - return null; - } - + + public void addFilter(FilterCriterion filterCriterion) { + filterCriteria.add(filterCriterion); + } + + public void addFilter(String filterValue, String filterGloss) { + addFilter(filterGloss == null ? new FilterCriterion(filterValue) : new FilterCriterion(filterValue, filterGloss)); + } + + public void removeFilter(FilterCriterion filter) { + filterCriteria.remove(filter); + } + + public Boolean getAllColumnSearch() { + return allColumnSearch; + } + + public void setAllColumnSearch(Boolean allColumnSearch) { + this.allColumnSearch = allColumnSearch; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getFilterValues() { + + Set filterValues = new HashSet(); + filterCriteria.forEach(filterCriterion -> { + filterValues.add(filterCriterion.getValue()); + }); + + return filterValues; + } + + public Set getFilterGlosses() { + + Set filterGlosses = new HashSet(); + filterCriteria.forEach(filterCriterion -> { + filterGlosses.add(filterCriterion.getGloss()); + }); + + return filterGlosses; + } + } diff --git a/src/main/java/org/tdl/vireo/model/NamedSearchFilterGroup.java b/src/main/java/org/tdl/vireo/model/NamedSearchFilterGroup.java new file mode 100644 index 0000000000..f9c5fbfdef --- /dev/null +++ b/src/main/java/org/tdl/vireo/model/NamedSearchFilterGroup.java @@ -0,0 +1,187 @@ +package org.tdl.vireo.model; + +import static javax.persistence.CascadeType.MERGE; +import static javax.persistence.CascadeType.REFRESH; +import static javax.persistence.FetchType.EAGER; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; +import org.tdl.vireo.model.validation.NamedSearchFilterValidator; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; + +import edu.tamu.framework.model.BaseEntity; + +@Entity +@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "user_id", "name" }) }) +public class NamedSearchFilterGroup extends BaseEntity { + + @ManyToOne(cascade = { REFRESH, MERGE }, optional = false) + @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, scope = User.class, property = "id") + @JsonIdentityReference(alwaysAsId = true) + private User user; + + @Column(nullable = true) + private String name; + + @Column(nullable = false) + private Boolean publicFlag; + + @Column(nullable = false) + private Boolean columnsFlag; + + @Column(nullable = false) + private Boolean umiRelease; + + @ManyToMany(cascade = { REFRESH, MERGE }, fetch = EAGER) + @OrderColumn + private List savedColumns; + + @Fetch(FetchMode.SELECT) + @OneToMany(cascade = { REFRESH, MERGE }, fetch = EAGER, orphanRemoval = true) + private List namedSearchFilters; + + public NamedSearchFilterGroup() { + setPublicFlag(false); + setColumnsFlag(false); + setUmiRelease(false); + setNamedSearchFilters(new ArrayList()); + setSavedColumns(new ArrayList()); + setModelValidator(new NamedSearchFilterValidator()); + } + + /** + * @return the user + */ + public User getUser() { + return user; + } + + /** + * @param user + * the user to set + */ + public void setUser(User user) { + this.user = user; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name + * the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the publicFlag + */ + public Boolean getPublicFlag() { + return publicFlag; + } + + /** + * @param publicFlag + * the publicFlag to set + */ + public void setPublicFlag(Boolean publicFlag) { + this.publicFlag = publicFlag; + } + + public Boolean getColumnsFlag() { + return columnsFlag; + } + + public void setColumnsFlag(Boolean columnsFlag) { + this.columnsFlag = columnsFlag; + } + + /** + * @return the umiRelease + */ + public Boolean getUmiRelease() { + return umiRelease; + } + + public List getSavedColumns() { + return savedColumns; + } + + public void setSavedColumns(List savedColumns) { + this.savedColumns = savedColumns; + } + + public void addSavedColumn(SubmissionListColumn submissionListColumn) { + if (!savedColumns.contains(submissionListColumn)) { + savedColumns.add(submissionListColumn); + } + } + + public void removeSavedColumn(SubmissionListColumn submissionListColumn) { + savedColumns.remove(submissionListColumn); + } + + /** + * @param umiRelease + * the umiRelease to set + */ + public void setUmiRelease(Boolean umiRelease) { + this.umiRelease = umiRelease; + } + + /** + * @return the filterCriteria + */ + public List getNamedSearchFilters() { + return namedSearchFilters; + } + + /** + * @param namedSearchFilters + * the filterCriteria to set + */ + public void setNamedSearchFilters(List namedSearchFilters) { + this.namedSearchFilters = namedSearchFilters; + } + + public void addFilterCriterion(NamedSearchFilter namedSearchFilter) { + if (!namedSearchFilters.contains(namedSearchFilter)) { + namedSearchFilters.add(namedSearchFilter); + } + } + + public void removeNamedSearchFilter(NamedSearchFilter namedSearchFilter) { + namedSearchFilters.remove(namedSearchFilter); + } + + public NamedSearchFilter getNamedSearchFilter(Long namedSearchFilterId) { + for (NamedSearchFilter namedSearchFilter : namedSearchFilters) { + if (namedSearchFilter.getId() == namedSearchFilterId) { + return namedSearchFilter; + } + } + return null; + } + +} diff --git a/src/main/java/org/tdl/vireo/model/Submission.java b/src/main/java/org/tdl/vireo/model/Submission.java index 6cb5076c37..18794097f3 100644 --- a/src/main/java/org/tdl/vireo/model/Submission.java +++ b/src/main/java/org/tdl/vireo/model/Submission.java @@ -50,7 +50,8 @@ public class Submission extends BaseEntity { @CollectionTable(uniqueConstraints = @UniqueConstraint(columnNames = { "submission_id", "submission_workflow_steps_id", "submissionWorkflowSteps_order" })) @OrderColumn private List submissionWorkflowSteps; - + + //This should most likely be handled by a field profile @Column(nullable = true) @Temporal(TemporalType.DATE) private Calendar dateOfGraduation; diff --git a/src/main/java/org/tdl/vireo/model/SubmissionState.java b/src/main/java/org/tdl/vireo/model/SubmissionState.java index 5856aa4b23..8665be64a1 100644 --- a/src/main/java/org/tdl/vireo/model/SubmissionState.java +++ b/src/main/java/org/tdl/vireo/model/SubmissionState.java @@ -47,7 +47,7 @@ public class SubmissionState extends BaseEntity { @JsonProperty("isEditableByStudent") private Boolean isEditableByStudent; - @Column(nullable = false) + @Column(nullable = true) @JsonProperty("isActive") private Boolean isActive; diff --git a/src/main/java/org/tdl/vireo/model/User.java b/src/main/java/org/tdl/vireo/model/User.java index d9dedcf735..81ddf2784e 100644 --- a/src/main/java/org/tdl/vireo/model/User.java +++ b/src/main/java/org/tdl/vireo/model/User.java @@ -106,11 +106,11 @@ public class User extends BaseEntity implements CoreUser { private List filterColumns; @ManyToOne(cascade = { REFRESH, MERGE }, fetch = EAGER, optional = true) - private NamedSearchFilter activeFilter; + private NamedSearchFilterGroup activeFilter; @Fetch(FetchMode.SELECT) @ManyToMany(cascade = { REFRESH, MERGE }, fetch = EAGER) - private List savedFilters; + private List savedFilters; public User() { setModelValidator(new UserValidator()); @@ -119,7 +119,7 @@ public User() { setShibbolethAffiliations(new TreeSet()); setSubmissionViewColumns(new ArrayList()); setFilterColumns(new ArrayList()); - setSavedFilters(new ArrayList()); + setSavedFilters(new ArrayList()); setPageSize(10); } @@ -481,7 +481,7 @@ public void removeSubmissionViewColumn(SubmissionListColumn displayedSubmissionC /** * @return the activeFilter */ - public NamedSearchFilter getActiveFilter() { + public NamedSearchFilterGroup getActiveFilter() { return activeFilter; } @@ -489,14 +489,14 @@ public NamedSearchFilter getActiveFilter() { * @param activeFilter * the activeFilter to set */ - public void setActiveFilter(NamedSearchFilter activeFilter) { + public void setActiveFilter(NamedSearchFilterGroup activeFilter) { this.activeFilter = activeFilter; } /** * @return the savedFilters */ - public List getSavedFilters() { + public List getSavedFilters() { return savedFilters; } @@ -504,24 +504,24 @@ public List getSavedFilters() { * @param savedFilters * the savedFilters to set */ - public void setSavedFilters(List savedFilters) { + public void setSavedFilters(List savedFilters) { this.savedFilters = savedFilters; } - public void addSavedFilter(NamedSearchFilter savedFilter) { + public void addSavedFilter(NamedSearchFilterGroup savedFilter) { if (!this.savedFilters.contains(savedFilter)) { this.savedFilters.add(savedFilter); } } - public void removeSavedFilter(NamedSearchFilter savedFilter) { + public void removeSavedFilter(NamedSearchFilterGroup savedFilter) { this.savedFilters.remove(savedFilter); } - public void loadActiveFilter(NamedSearchFilter filter) { + public void loadActiveFilter(NamedSearchFilterGroup filter) { this.activeFilter.setSavedColumns(filter.getSavedColumns()); - this.activeFilter.setFilterCriteria(filter.getFilterCriteria()); + this.activeFilter.setNamedSearchFilters(filter.getNamedSearchFilters()); this.activeFilter.setPublicFlag(filter.getPublicFlag()); this.activeFilter.setColumnsFlag(filter.getColumnsFlag()); diff --git a/src/main/java/org/tdl/vireo/model/repo/FilterCriterionRepo.java b/src/main/java/org/tdl/vireo/model/repo/FilterCriterionRepo.java deleted file mode 100644 index 03fd5d4458..0000000000 --- a/src/main/java/org/tdl/vireo/model/repo/FilterCriterionRepo.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.tdl.vireo.model.repo; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.tdl.vireo.model.FilterCriterion; -import org.tdl.vireo.model.repo.custom.FilterCriterionRepoCustom; - -public interface FilterCriterionRepo extends JpaRepository, FilterCriterionRepoCustom { - -} diff --git a/src/main/java/org/tdl/vireo/model/repo/NamedSearchFilterGroupRepo.java b/src/main/java/org/tdl/vireo/model/repo/NamedSearchFilterGroupRepo.java new file mode 100644 index 0000000000..0e7ac33936 --- /dev/null +++ b/src/main/java/org/tdl/vireo/model/repo/NamedSearchFilterGroupRepo.java @@ -0,0 +1,17 @@ +package org.tdl.vireo.model.repo; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.tdl.vireo.model.NamedSearchFilterGroup; +import org.tdl.vireo.model.repo.custom.NamedSearchFilterGroupRepoCustom; + +public interface NamedSearchFilterGroupRepo extends JpaRepository, NamedSearchFilterGroupRepoCustom { + + public List findByPublicFlagTrue(); + + public NamedSearchFilterGroup findByNameAndPublicFlagTrue(String name); + + public void delete(NamedSearchFilterGroup NamedSearchFilterGroup); + +} diff --git a/src/main/java/org/tdl/vireo/model/repo/NamedSearchFilterRepo.java b/src/main/java/org/tdl/vireo/model/repo/NamedSearchFilterRepo.java index 0516e879c9..0901c625da 100644 --- a/src/main/java/org/tdl/vireo/model/repo/NamedSearchFilterRepo.java +++ b/src/main/java/org/tdl/vireo/model/repo/NamedSearchFilterRepo.java @@ -1,17 +1,9 @@ package org.tdl.vireo.model.repo; -import java.util.List; - import org.springframework.data.jpa.repository.JpaRepository; import org.tdl.vireo.model.NamedSearchFilter; import org.tdl.vireo.model.repo.custom.NamedSearchFilterRepoCustom; public interface NamedSearchFilterRepo extends JpaRepository, NamedSearchFilterRepoCustom { - public List findByPublicFlagTrue(); - - public NamedSearchFilter findByNameAndPublicFlagTrue(String name); - - public void delete(NamedSearchFilter namedSearchFilter); - } diff --git a/src/main/java/org/tdl/vireo/model/repo/SubmissionRepo.java b/src/main/java/org/tdl/vireo/model/repo/SubmissionRepo.java index e32c2fe504..5de449fcb9 100644 --- a/src/main/java/org/tdl/vireo/model/repo/SubmissionRepo.java +++ b/src/main/java/org/tdl/vireo/model/repo/SubmissionRepo.java @@ -2,18 +2,13 @@ import java.util.List; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaRepository; - import org.tdl.vireo.model.Organization; import org.tdl.vireo.model.Submission; import org.tdl.vireo.model.User; import org.tdl.vireo.model.repo.custom.SubmissionRepoCustom; -public interface SubmissionRepo extends JpaRepository, SubmissionRepoCustom, JpaSpecificationExecutor { +public interface SubmissionRepo extends JpaRepository, SubmissionRepoCustom { public Submission findBySubmitterAndOrganization(User submitter, Organization organization); @@ -21,10 +16,4 @@ public interface SubmissionRepo extends JpaRepository, Submiss public List findAllBySubmitter(User submitter); - public Page findAll(Specification specification, Pageable pageable); - - public List findAll(Specification specification); - - public Page findAll(Pageable pageable); - } diff --git a/src/main/java/org/tdl/vireo/model/repo/custom/FilterCriterionRepoCustom.java b/src/main/java/org/tdl/vireo/model/repo/custom/FilterCriterionRepoCustom.java deleted file mode 100644 index 8346afcbde..0000000000 --- a/src/main/java/org/tdl/vireo/model/repo/custom/FilterCriterionRepoCustom.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.tdl.vireo.model.repo.custom; - -import org.tdl.vireo.model.FilterCriterion; -import org.tdl.vireo.model.SubmissionListColumn; - -public interface FilterCriterionRepoCustom { - public FilterCriterion create(SubmissionListColumn submissionListColumn); - - public FilterCriterion cloneFilterCriterion(FilterCriterion filterCriterion); -} diff --git a/src/main/java/org/tdl/vireo/model/repo/custom/NamedSearchFilterGroupRepoCustom.java b/src/main/java/org/tdl/vireo/model/repo/custom/NamedSearchFilterGroupRepoCustom.java new file mode 100644 index 0000000000..6472aa44c8 --- /dev/null +++ b/src/main/java/org/tdl/vireo/model/repo/custom/NamedSearchFilterGroupRepoCustom.java @@ -0,0 +1,18 @@ +package org.tdl.vireo.model.repo.custom; + +import org.tdl.vireo.model.NamedSearchFilterGroup; +import org.tdl.vireo.model.User; + +public interface NamedSearchFilterGroupRepoCustom { + + public NamedSearchFilterGroup create(User user); + + public NamedSearchFilterGroup create(User user, String name); + + public NamedSearchFilterGroup clone(NamedSearchFilterGroup newNamedSearchFilter, NamedSearchFilterGroup namedSearchFilterGroup); + + public NamedSearchFilterGroup createFromFilter(NamedSearchFilterGroup namedSearchFilterGroup); + + public void delete(NamedSearchFilterGroup namedSearchFilterGroup); + +} diff --git a/src/main/java/org/tdl/vireo/model/repo/custom/NamedSearchFilterRepoCustom.java b/src/main/java/org/tdl/vireo/model/repo/custom/NamedSearchFilterRepoCustom.java index b02047ca3e..3e5e90d3e9 100644 --- a/src/main/java/org/tdl/vireo/model/repo/custom/NamedSearchFilterRepoCustom.java +++ b/src/main/java/org/tdl/vireo/model/repo/custom/NamedSearchFilterRepoCustom.java @@ -1,18 +1,10 @@ package org.tdl.vireo.model.repo.custom; import org.tdl.vireo.model.NamedSearchFilter; -import org.tdl.vireo.model.User; +import org.tdl.vireo.model.SubmissionListColumn; public interface NamedSearchFilterRepoCustom { - - public NamedSearchFilter create(User user); - - public NamedSearchFilter create(User user, String name); - - public NamedSearchFilter clone(NamedSearchFilter newNamedSearchFilter, NamedSearchFilter namedSearchFilter); - - public NamedSearchFilter createFromFilter(NamedSearchFilter namedSearchFilter); - - public void delete(NamedSearchFilter namedSearchFilter); - + public NamedSearchFilter create(SubmissionListColumn submissionListColumn); + + public NamedSearchFilter cloneFilterCriterion(NamedSearchFilter namedSearchFilter); } diff --git a/src/main/java/org/tdl/vireo/model/repo/custom/SubmissionRepoCustom.java b/src/main/java/org/tdl/vireo/model/repo/custom/SubmissionRepoCustom.java index 47e403f8de..2ec3b7aa69 100644 --- a/src/main/java/org/tdl/vireo/model/repo/custom/SubmissionRepoCustom.java +++ b/src/main/java/org/tdl/vireo/model/repo/custom/SubmissionRepoCustom.java @@ -4,20 +4,19 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.tdl.vireo.model.NamedSearchFilterGroup; import org.tdl.vireo.model.Organization; import org.tdl.vireo.model.Submission; import org.tdl.vireo.model.SubmissionListColumn; import org.tdl.vireo.model.SubmissionState; import org.tdl.vireo.model.User; -import edu.tamu.framework.model.Credentials; - public interface SubmissionRepoCustom { public Submission create(User submitter, Organization organization, SubmissionState submissionState); - public Page pageableDynamicSubmissionQuery(Credentials credentials, List submissionListColums, Pageable pageable); + public Page pageableDynamicSubmissionQuery(NamedSearchFilterGroup activeFilter, List submissionListColums, Pageable pageable); - public List dynamicSubmissionQuery(Credentials credentials, List submissionListColums); + public List batchDynamicSubmissionQuery(NamedSearchFilterGroup activeFilter, List submissionListColums); } diff --git a/src/main/java/org/tdl/vireo/model/repo/impl/FieldProfileRepoImpl.java b/src/main/java/org/tdl/vireo/model/repo/impl/FieldProfileRepoImpl.java index a11d07d874..0cf3590a65 100644 --- a/src/main/java/org/tdl/vireo/model/repo/impl/FieldProfileRepoImpl.java +++ b/src/main/java/org/tdl/vireo/model/repo/impl/FieldProfileRepoImpl.java @@ -21,7 +21,7 @@ public class FieldProfileRepoImpl extends HeritableRepo implements FieldProfileRepoCustom { - private static final List PREDICATE_PATH = new ArrayList(Arrays.asList(new String[] { "fieldValues", "predicate", "value" })); + private static final List PREDICATE_PATH = new ArrayList(Arrays.asList(new String[] { "fieldValues", "fieldPredicate", "value" })); private static final List VALUE_PATH = new ArrayList(Arrays.asList(new String[] { "fieldValues", "value" })); diff --git a/src/main/java/org/tdl/vireo/model/repo/impl/FilterCriterionRepoImpl.java b/src/main/java/org/tdl/vireo/model/repo/impl/FilterCriterionRepoImpl.java deleted file mode 100644 index 24a04b86da..0000000000 --- a/src/main/java/org/tdl/vireo/model/repo/impl/FilterCriterionRepoImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.tdl.vireo.model.repo.impl; - -import org.springframework.beans.factory.annotation.Autowired; -import org.tdl.vireo.model.FilterCriterion; -import org.tdl.vireo.model.SubmissionListColumn; -import org.tdl.vireo.model.repo.FilterCriterionRepo; -import org.tdl.vireo.model.repo.custom.FilterCriterionRepoCustom; - -public class FilterCriterionRepoImpl implements FilterCriterionRepoCustom { - - @Autowired - FilterCriterionRepo filterCriterionRepo; - - @Override - public FilterCriterion create(SubmissionListColumn submissionListColumn) { - FilterCriterion fc = new FilterCriterion(); - fc.setSubmissionListColumn(submissionListColumn); - return filterCriterionRepo.save(fc); - } - - public FilterCriterion cloneFilterCriterion(FilterCriterion filterCriterion) { - FilterCriterion newFilterCriterion = filterCriterionRepo.create(filterCriterion.getSubmissionListColumn()); - - newFilterCriterion.setName(filterCriterion.getName()); - filterCriterion.getFilters().forEach(filter -> { - newFilterCriterion.addFilter(filter); - }); - - return filterCriterionRepo.save(newFilterCriterion); - } - -} diff --git a/src/main/java/org/tdl/vireo/model/repo/impl/NamedSearchFilterGroupRepoImpl.java b/src/main/java/org/tdl/vireo/model/repo/impl/NamedSearchFilterGroupRepoImpl.java new file mode 100644 index 0000000000..07f2fa2c57 --- /dev/null +++ b/src/main/java/org/tdl/vireo/model/repo/impl/NamedSearchFilterGroupRepoImpl.java @@ -0,0 +1,73 @@ +package org.tdl.vireo.model.repo.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.tdl.vireo.model.NamedSearchFilterGroup; +import org.tdl.vireo.model.User; +import org.tdl.vireo.model.repo.NamedSearchFilterRepo; +import org.tdl.vireo.model.repo.NamedSearchFilterGroupRepo; +import org.tdl.vireo.model.repo.UserRepo; +import org.tdl.vireo.model.repo.custom.NamedSearchFilterGroupRepoCustom; + +public class NamedSearchFilterGroupRepoImpl implements NamedSearchFilterGroupRepoCustom { + + @Autowired + private NamedSearchFilterGroupRepo namedSearchFilterRepo; + + @Autowired + private NamedSearchFilterRepo filterCriterionRepo; + + @Autowired + private UserRepo userRepo; + + @Override + public NamedSearchFilterGroup create(User user) { + NamedSearchFilterGroup newNamedSearchFilter = new NamedSearchFilterGroup(); + newNamedSearchFilter.setUser(user); + + return namedSearchFilterRepo.save(newNamedSearchFilter); + } + + @Override + public NamedSearchFilterGroup create(User user, String name) { + NamedSearchFilterGroup newNamedSearchFilter = new NamedSearchFilterGroup(); + newNamedSearchFilter.setUser(user); + newNamedSearchFilter.setName(name); + return namedSearchFilterRepo.save(newNamedSearchFilter); + } + + public NamedSearchFilterGroup clone(NamedSearchFilterGroup newNamedSearchFilter, NamedSearchFilterGroup namedSearchFilterGroup) { + newNamedSearchFilter.setPublicFlag(namedSearchFilterGroup.getPublicFlag()); + newNamedSearchFilter.setUmiRelease(namedSearchFilterGroup.getUmiRelease()); + newNamedSearchFilter.setColumnsFlag(namedSearchFilterGroup.getColumnsFlag()); + namedSearchFilterGroup.getNamedSearchFilters().forEach(filterCriterion -> { + newNamedSearchFilter.addFilterCriterion(filterCriterionRepo.cloneFilterCriterion(filterCriterion)); + }); + + if(newNamedSearchFilter.getColumnsFlag()) { + namedSearchFilterGroup.getSavedColumns().forEach(column -> { + newNamedSearchFilter.addSavedColumn(column); + }); + } + + return newNamedSearchFilter; + } + + public NamedSearchFilterGroup createFromFilter(NamedSearchFilterGroup namedSearchFilterGroup) { + NamedSearchFilterGroup newNamedSearchFilter = namedSearchFilterRepo.create(namedSearchFilterGroup.getUser()); + newNamedSearchFilter.setName(namedSearchFilterGroup.getName()); + + return namedSearchFilterRepo.save(clone(newNamedSearchFilter, namedSearchFilterGroup)); + } + + @Override + public void delete(NamedSearchFilterGroup namedSearchFilterGroup) { + User user = namedSearchFilterGroup.getUser(); + user.setActiveFilter(null); + userRepo.save(user); + namedSearchFilterGroup.setUser(null); + namedSearchFilterGroup.setNamedSearchFilters(null); + namedSearchFilterGroup.setSavedColumns(null); + namedSearchFilterRepo.delete(namedSearchFilterGroup.getId()); + } + +} diff --git a/src/main/java/org/tdl/vireo/model/repo/impl/NamedSearchFilterRepoImpl.java b/src/main/java/org/tdl/vireo/model/repo/impl/NamedSearchFilterRepoImpl.java index 4e3f2d33c4..313af76d37 100644 --- a/src/main/java/org/tdl/vireo/model/repo/impl/NamedSearchFilterRepoImpl.java +++ b/src/main/java/org/tdl/vireo/model/repo/impl/NamedSearchFilterRepoImpl.java @@ -2,72 +2,32 @@ import org.springframework.beans.factory.annotation.Autowired; import org.tdl.vireo.model.NamedSearchFilter; -import org.tdl.vireo.model.User; -import org.tdl.vireo.model.repo.FilterCriterionRepo; +import org.tdl.vireo.model.SubmissionListColumn; import org.tdl.vireo.model.repo.NamedSearchFilterRepo; -import org.tdl.vireo.model.repo.UserRepo; import org.tdl.vireo.model.repo.custom.NamedSearchFilterRepoCustom; public class NamedSearchFilterRepoImpl implements NamedSearchFilterRepoCustom { - @Autowired - private NamedSearchFilterRepo namedSearchFilterRepo; - - @Autowired - private FilterCriterionRepo filterCriterionRepo; - - @Autowired - private UserRepo userRepo; - - @Override - public NamedSearchFilter create(User user) { - NamedSearchFilter newNamedSearchFilter = new NamedSearchFilter(); - newNamedSearchFilter.setUser(user); - - return namedSearchFilterRepo.save(newNamedSearchFilter); - } - - @Override - public NamedSearchFilter create(User user, String name) { - NamedSearchFilter newNamedSearchFilter = new NamedSearchFilter(); - newNamedSearchFilter.setUser(user); - newNamedSearchFilter.setName(name); - return namedSearchFilterRepo.save(newNamedSearchFilter); - } - - public NamedSearchFilter clone(NamedSearchFilter newNamedSearchFilter, NamedSearchFilter namedSearchFilter) { - newNamedSearchFilter.setPublicFlag(namedSearchFilter.getPublicFlag()); - newNamedSearchFilter.setUmiRelease(namedSearchFilter.getUmiRelease()); - newNamedSearchFilter.setColumnsFlag(namedSearchFilter.getColumnsFlag()); - namedSearchFilter.getFilterCriteria().forEach(filterCriterion -> { - newNamedSearchFilter.addFilterCriterion(filterCriterionRepo.cloneFilterCriterion(filterCriterion)); - }); - - if(newNamedSearchFilter.getColumnsFlag()) { - namedSearchFilter.getSavedColumns().forEach(column -> { - newNamedSearchFilter.addSavedColumn(column); - }); - } - - return newNamedSearchFilter; - } - - public NamedSearchFilter createFromFilter(NamedSearchFilter namedSearchFilter) { - NamedSearchFilter newNamedSearchFilter = namedSearchFilterRepo.create(namedSearchFilter.getUser()); - newNamedSearchFilter.setName(namedSearchFilter.getName()); - - return namedSearchFilterRepo.save(clone(newNamedSearchFilter, namedSearchFilter)); - } - - @Override - public void delete(NamedSearchFilter namedSearchFilter) { - User user = namedSearchFilter.getUser(); - user.setActiveFilter(null); - userRepo.save(user); - namedSearchFilter.setUser(null); - namedSearchFilter.setFilterCriteria(null); - namedSearchFilter.setSavedColumns(null); - namedSearchFilterRepo.delete(namedSearchFilter.getId()); - } + @Autowired + NamedSearchFilterRepo filterCriterionRepo; + + @Override + public NamedSearchFilter create(SubmissionListColumn submissionListColumn) { + NamedSearchFilter fc = new NamedSearchFilter(); + fc.setName(submissionListColumn.getTitle()); + fc.setSubmissionListColumn(submissionListColumn); + return filterCriterionRepo.save(fc); + } + + public NamedSearchFilter cloneFilterCriterion(NamedSearchFilter filterCriterion) { + NamedSearchFilter newFilterCriterion = filterCriterionRepo.create(filterCriterion.getSubmissionListColumn()); + + newFilterCriterion.setName(filterCriterion.getName()); + filterCriterion.getFilters().forEach(filter -> { + newFilterCriterion.addFilter(filter); + }); + + return filterCriterionRepo.save(newFilterCriterion); + } } diff --git a/src/main/java/org/tdl/vireo/model/repo/impl/SubmissionRepoImpl.java b/src/main/java/org/tdl/vireo/model/repo/impl/SubmissionRepoImpl.java index b36248aebe..f802d044d3 100644 --- a/src/main/java/org/tdl/vireo/model/repo/impl/SubmissionRepoImpl.java +++ b/src/main/java/org/tdl/vireo/model/repo/impl/SubmissionRepoImpl.java @@ -1,65 +1,42 @@ package org.tdl.vireo.model.repo.impl; -import static edu.tamu.framework.util.EntityUtility.recursivelyFindField; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; + +import javax.sql.DataSource; -import javax.persistence.Column; -import javax.persistence.EntityManager; -import javax.persistence.Id; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Fetch; -import javax.persistence.criteria.Join; -import javax.persistence.criteria.JoinType; -import javax.persistence.criteria.Order; -import javax.persistence.criteria.Path; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; -import javax.persistence.criteria.Subquery; - -import org.hibernate.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.tdl.vireo.model.NamedSearchFilter; +import org.springframework.jdbc.core.JdbcTemplate; +import org.tdl.vireo.enums.Sort; +import org.tdl.vireo.model.NamedSearchFilterGroup; import org.tdl.vireo.model.Organization; import org.tdl.vireo.model.Submission; import org.tdl.vireo.model.SubmissionListColumn; import org.tdl.vireo.model.SubmissionState; import org.tdl.vireo.model.User; +import org.tdl.vireo.model.repo.FieldPredicateRepo; import org.tdl.vireo.model.repo.SubmissionListColumnRepo; import org.tdl.vireo.model.repo.SubmissionRepo; import org.tdl.vireo.model.repo.SubmissionWorkflowStepRepo; -import org.tdl.vireo.model.repo.UserRepo; import org.tdl.vireo.model.repo.custom.SubmissionRepoCustom; -import edu.tamu.framework.model.Credentials; - public class SubmissionRepoImpl implements SubmissionRepoCustom { - @PersistenceContext - private EntityManager em; - @Autowired private SubmissionRepo submissionRepo; @Autowired - private UserRepo userRepo; + private FieldPredicateRepo fieldPredicateRepo; + @Autowired private SubmissionWorkflowStepRepo submissionWorkflowStepRepo; @@ -67,6 +44,14 @@ public class SubmissionRepoImpl implements SubmissionRepoCustom { @Autowired private SubmissionListColumnRepo submissionListColumnRepo; + private JdbcTemplate jdbcTemplate; + + @Autowired + public SubmissionRepoImpl(DataSource dataSource) { + jdbcTemplate = new JdbcTemplate(dataSource); + } + + @Override public Submission create(User submitter, Organization organization, SubmissionState startingState) { @@ -76,161 +61,50 @@ public Submission create(User submitter, Organization organization, SubmissionSt return submissionRepo.save(submission); } - - public List dynamicSubmissionQuery(Credentials credentials, List submissionListColums) { - - User user = userRepo.findByEmail(credentials.getEmail()); - - Set allColumnSearchFilters = new HashSet(); - NamedSearchFilter activeFilter = user.getActiveFilter(); - - List allSubmissionListColumns = submissionListColumnRepo.findAll(); - - // set sort and sort order on all submission list columns that are set on users submission list columns - submissionListColums.forEach(submissionListColumn -> { - for (SubmissionListColumn slc : allSubmissionListColumns) { - if (submissionListColumn.equals(slc)) { - slc.setVisible(true); - slc.setSort(submissionListColumn.getSort()); - slc.setSortOrder(submissionListColumn.getSortOrder()); - break; - } - } + @Override + public List batchDynamicSubmissionQuery(NamedSearchFilterGroup activeFilter, List submissionListColums) { + String[] queryStrings = craftDynamicSubmissionQuery(activeFilter, submissionListColums, null); + List ids = new ArrayList(); + this.jdbcTemplate.queryForList(queryStrings[0]).forEach(row -> { + ids.add((Long) row.get("ID")); }); + return submissionRepo.findAll(ids); + } - // add column filters to SubmissionListColumns, add all column filters to allColumnSearchFilters - if (activeFilter != null) { - activeFilter.getFilterCriteria().forEach(filterCriterion -> { - if (filterCriterion.getAllColumnSearch()) { - allColumnSearchFilters.addAll(filterCriterion.getFilters()); - } else { - for (SubmissionListColumn slc : allSubmissionListColumns) { - if (filterCriterion.getSubmissionListColumn().equals(slc)) { - slc.addAllFilters(filterCriterion.getFilters()); - break; - } - } - } - }); - } - + @Override + public Page pageableDynamicSubmissionQuery(NamedSearchFilterGroup activeFilter, List submissionListColums, Pageable pageable) { + String[] queryStrings = craftDynamicSubmissionQuery(activeFilter, submissionListColums, pageable); + List ids = new ArrayList(); + this.jdbcTemplate.queryForList(queryStrings[0]).forEach(row -> { + ids.add((Long) row.get("ID")); + }); + List actualResults = new ArrayList(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - - CriteriaQuery query = cb.createQuery(Submission.class); - - Root root = query.from(Submission.class); - - List _groupPredicates = new ArrayList(); - - List _filterPredicates = new ArrayList(); - - Map> fetches = new HashMap>(); - - Path fieldValueFetchPath = null; - - for (SubmissionListColumn submissionListColumn : allSubmissionListColumns) { - Path path = null; - if (submissionListColumn.getValuePath().size() > 0) { - if (submissionListColumn.getPredicate() != null) { - if (submissionListColumn.getSortOrder() > 0 || submissionListColumn.getFilters().size() > 0 || submissionListColumn.getVisible()) { - - Join join = (Join) root.fetch("fieldValues", JoinType.LEFT); - - path = join.get("value"); - - Subquery subquery = query.subquery(Submission.class); - Root subQueryRoot = subquery.from(Submission.class); - - subquery.select(subQueryRoot.get("id")).distinct(true); - subquery.where(cb.equal(subQueryRoot.joinSet("fieldValues", JoinType.LEFT).get("fieldPredicate").get("value"), submissionListColumn.getPredicate())); - - _groupPredicates.add(cb.or(cb.equal(join.get("fieldPredicate").get("value"), submissionListColumn.getPredicate()), root.get("id").in(subquery).not())); - - } - } else { - - String navPath = null; - - for (String property : submissionListColumn.getValuePath()) { - if (path == null) { - navPath = property; - if (requiresFetch(root, property)) { - Fetch fetch = fetches.get(navPath); - if (fetch == null) { - fetch = root.fetch(property, JoinType.LEFT); - fetches.put(navPath, fetch); - } - path = (Path) fetch; - } else { - path = root.get(property); - } - } else { - navPath += "." + property; - if (requiresFetch(path, property)) { - Fetch fetch = fetches.get(navPath); - if (fetch == null) { - fetch = ((Fetch) path).fetch(property, JoinType.LEFT); - fetches.put(navPath, fetch); - } - path = (Path) fetch; - } else { - path = path.get(property); - } - } - } - + // order them + for (Long id : ids) { + for (Submission ps : submissionRepo.findAll(ids)) { + if (ps.getId().equals(id)) { + actualResults.add(ps); } - - for (String filter : submissionListColumn.getFilters()) { - _filterPredicates.add(cb.like(cb.lower(path.as(String.class)), "%" + filter.toLowerCase() + "%")); - } - - for (String filter : allColumnSearchFilters) { - if (submissionListColumn.getPredicate() != null) { - if (fieldValueFetchPath == null) { - fieldValueFetchPath = (Path) root.fetch("fieldValues"); - } - _filterPredicates.add(cb.like(cb.lower(fieldValueFetchPath.get("value").as(String.class)), "%" + filter.toLowerCase() + "%")); - } else { - _filterPredicates.add(cb.like(cb.lower(path.as(String.class)), "%" + filter.toLowerCase() + "%")); - } - } - } } - Predicate predicate = null; - - if (_filterPredicates.size() == 0) { - predicate = cb.and(_groupPredicates.toArray(new Predicate[_groupPredicates.size()])); - } else { - predicate = cb.and(cb.and(_groupPredicates.toArray(new Predicate[_groupPredicates.size()])), cb.or(_filterPredicates.toArray(new Predicate[_filterPredicates.size()]))); - } - - query.select(root).distinct(true).where(predicate); - - TypedQuery typedQuery = em.createQuery(query); - - System.out.println("\n" + typedQuery.unwrap(Query.class).getQueryString() + "\n"); - - return typedQuery.getResultList(); - + Long total = this.jdbcTemplate.queryForObject(queryStrings[1], Long.class); + int offset = pageable.getPageSize() * pageable.getPageNumber(); + int limit = pageable.getPageSize(); + return new PageImpl(actualResults, new PageRequest((int) Math.floor(offset / limit), limit), total); } - @Override - public Page pageableDynamicSubmissionQuery(Credentials credentials, List submissionListColums, Pageable pageable) { - - User user = userRepo.findByEmail(credentials.getEmail()); + private String[] craftDynamicSubmissionQuery(NamedSearchFilterGroup activeFilter, List submissionListColums, Pageable pageable) { + // set up storage for user's preferred columns Set allColumnSearchFilters = new HashSet(); - NamedSearchFilter activeFilter = user.getActiveFilter(); - + // get all the possible columns, some of which we will make visible List allSubmissionListColumns = submissionListColumnRepo.findAll(); - // set sort and sort order on all submission list columns that are set on users submission list columns + // set sort and sort order on all submission list columns that are set on the requesting user's submission list columns submissionListColums.forEach(submissionListColumn -> { for (SubmissionListColumn slc : allSubmissionListColumns) { if (submissionListColumn.equals(slc)) { @@ -244,13 +118,13 @@ public Page pageableDynamicSubmissionQuery(Credentials credentials, // add column filters to SubmissionListColumns, add all column filters to allColumnSearchFilters if (activeFilter != null) { - activeFilter.getFilterCriteria().forEach(filterCriterion -> { - if (filterCriterion.getAllColumnSearch()) { - allColumnSearchFilters.addAll(filterCriterion.getFilters()); + activeFilter.getNamedSearchFilters().forEach(namedSearchFilter -> { + if (namedSearchFilter.getAllColumnSearch()) { + allColumnSearchFilters.addAll(namedSearchFilter.getFilterValues()); } else { for (SubmissionListColumn slc : allSubmissionListColumns) { - if (filterCriterion.getSubmissionListColumn().equals(slc)) { - slc.addAllFilters(filterCriterion.getFilters()); + if (namedSearchFilter.getSubmissionListColumn().equals(slc)) { + slc.addAllFilters(namedSearchFilter.getFilterValues()); break; } } @@ -266,182 +140,217 @@ public int compare(SubmissionListColumn svc1, SubmissionListColumn svc2) { } }); - Boolean filterExists = false; - Boolean predicateExists = false; + + StringBuilder sqlSelectBuilder = new StringBuilder("SELECT DISTINCT s.id,"); + + StringBuilder sqlCountSelectBuilder = new StringBuilder("SELECT COUNT(*) FROM submission s "); + + StringBuilder sqlJoinsBuilder = new StringBuilder(); + StringBuilder sqlWheresBuilder = new StringBuilder(); + StringBuilder sqlOrderBysBuilder = new StringBuilder(); - List orders = new ArrayList(); + int n = 0; for (SubmissionListColumn submissionListColumn : allSubmissionListColumns) { - if (submissionListColumn.getFilters().size() > 0) { - filterExists = true; - } - - if (submissionListColumn.getSort() != org.tdl.vireo.enums.Sort.NONE && submissionListColumn.getPredicate() != null) { - predicateExists = true; - } - - if (submissionListColumn.getValuePath().size() > 0) { - String fullPath = String.join(".", submissionListColumn.getValuePath()); - switch (submissionListColumn.getSort()) { - case ASC: - orders.add(new Sort.Order(Sort.Direction.ASC, fullPath)); - break; - case DESC: - orders.add(new Sort.Order(Sort.Direction.DESC, fullPath)); - break; - default: - break; - } - } - } - - if (!filterExists && !allColumnSearchFilters.isEmpty()) { - filterExists = true; - } - - Page pageResults = null; - - if (filterExists || orders.size() > 0) { - if (filterExists || predicateExists) { - - CriteriaBuilder cb = em.getCriteriaBuilder(); - - CriteriaQuery query = cb.createQuery(Submission.class); - - Root root = query.from(Submission.class); - - List _orders = new ArrayList(); - - List _groupPredicates = new ArrayList(); - - List _filterPredicates = new ArrayList(); - - Map> fetches = new HashMap>(); - - Path fieldValueFetchPath = null; - - for (SubmissionListColumn submissionListColumn : allSubmissionListColumns) { - Path path = null; - if (submissionListColumn.getValuePath().size() > 0) { - if (submissionListColumn.getPredicate() != null) { - if (submissionListColumn.getSortOrder() > 0 || submissionListColumn.getFilters().size() > 0 || submissionListColumn.getVisible()) { - - Join join = (Join) root.fetch("fieldValues", JoinType.LEFT); - - path = join.get("value"); - - Subquery subquery = query.subquery(Submission.class); - Root subQueryRoot = subquery.from(Submission.class); - - subquery.select(subQueryRoot.get("id")).distinct(true); - subquery.where(cb.equal(subQueryRoot.joinSet("fieldValues", JoinType.LEFT).get("fieldPredicate").get("value"), submissionListColumn.getPredicate())); - - _groupPredicates.add(cb.or(cb.equal(join.get("fieldPredicate").get("value"), submissionListColumn.getPredicate()), root.get("id").in(subquery).not())); + if (submissionListColumn.getSortOrder() > 0 || submissionListColumn.getFilters().size() > 0 || submissionListColumn.getVisible()) { + + + String pathString = String.join(".", submissionListColumn.getValuePath()); + + System.out.println("\n\n\n"+pathString+"\n\n\n"); + + switch(pathString) { + case "fieldValues.value": + + Long predicateId = fieldPredicateRepo.findByValue(submissionListColumn.getPredicate()).getId(); + + sqlJoinsBuilder.append("\nLEFT JOIN") + .append("\n (SELECT sfv").append(n).append(".submission_id, fv").append(n).append(".*") + .append("\n FROM submission_field_values sfv").append(n) + .append("\n LEFT JOIN field_value fv").append(n).append(" ON fv").append(n).append(".id=sfv").append(n).append(".field_values_id ") + .append("\n WHERE fv").append(n).append(".field_predicate_id=").append(predicateId).append(") pfv").append(n).append("\n ON pfv").append(n).append(".submission_id=s.id"); + + if (submissionListColumn.getSortOrder() > 0) { + setColumnOrdering(submissionListColumn.getSort(), sqlSelectBuilder, sqlOrderBysBuilder, " pfv" + n + ".value"); + } - } - } else { + for (String filterString : submissionListColumn.getFilters()) { + + if(submissionListColumn.getInputType().getName().equals("INPUT_DATETIME")) { + // Column's values are of type datetime + if(filterString.contains("|")) { + // Date Range + String[] dates = filterString.split(Pattern.quote("|")); + sqlWheresBuilder.append(" ( CAST(pfv").append(n).append(".value AS DATETIME) BETWEEN '").append(dates[0]).append("' AND '").append(dates[1]).append("') OR"); + + } else { + // Date Match + sqlWheresBuilder.append(" ( CAST(pfv").append(n).append(".value AS DATETIME) = '").append(filterString).append("') OR"); + } + + } else { + // Column's values can be handled by this default + sqlWheresBuilder.append(" LOWER(pfv").append(n).append(".value) LIKE '%").append(filterString.toLowerCase()).append("%' OR"); + } + + } - String navPath = null; + n++; + + break; + + case "id": + + if (submissionListColumn.getSortOrder() > 0) { + setColumnOrdering(submissionListColumn.getSort(), sqlSelectBuilder, sqlOrderBysBuilder, " s.id"); + } - for (String property : submissionListColumn.getValuePath()) { - if (path == null) { - navPath = property; - if (requiresFetch(root, property)) { - Fetch fetch = fetches.get(navPath); - if (fetch == null) { - fetch = root.fetch(property, JoinType.LEFT); - fetches.put(navPath, fetch); - } - path = (Path) fetch; - } else { - path = root.get(property); - } - } else { - navPath += "." + property; - if (requiresFetch(path, property)) { - Fetch fetch = fetches.get(navPath); - if (fetch == null) { - fetch = ((Fetch) path).fetch(property, JoinType.LEFT); - fetches.put(navPath, fetch); - } - path = (Path) fetch; - } else { - path = path.get(property); - } - } - } + for (String filterString : submissionListColumn.getFilters()) { + sqlWheresBuilder.append(" s").append(".id = ").append(filterString).append(" OR"); + } + + break; + + case "state.name": + + sqlJoinsBuilder.append("\nLEFT JOIN submission_state ss ON ss.id=s.state_id"); + + if (submissionListColumn.getSortOrder() > 0) { + setColumnOrdering(submissionListColumn.getSort(), sqlSelectBuilder, sqlOrderBysBuilder, " ss.name"); + } + + for (String filterString : submissionListColumn.getFilters()) { + sqlWheresBuilder.append(" LOWER(ss").append(".name) LIKE '%").append(filterString.toLowerCase()).append("%' OR"); + } + + break; + + case "organization.name": + + if(sqlJoinsBuilder.indexOf("LEFT JOIN organization o ON o.id=s.organization_id") == -1) + sqlJoinsBuilder.append("\nLEFT JOIN organization o ON o.id=s.organization_id"); + + if (submissionListColumn.getSortOrder() > 0) { + setColumnOrdering(submissionListColumn.getSort(), sqlSelectBuilder, sqlOrderBysBuilder, " o.name"); + } + for (String filterString : submissionListColumn.getFilters()) { + sqlWheresBuilder.append(" LOWER(o").append(".name) LIKE '%").append(filterString.toLowerCase()).append("%' OR"); + } + + break; + + case "organization.category.name": + + + if(sqlJoinsBuilder.indexOf("LEFT JOIN organization o ON o.id=s.organization_id") == -1) + sqlJoinsBuilder.append("\nLEFT JOIN organization o ON o.id=s.organization_id"); + sqlJoinsBuilder.append("\nLEFT JOIN organization_category oc ON oc.id=o.category_id"); + + if (submissionListColumn.getSortOrder() > 0) { + setColumnOrdering(submissionListColumn.getSort(), sqlSelectBuilder, sqlOrderBysBuilder, " oc.name"); } - for (String filter : submissionListColumn.getFilters()) { - _filterPredicates.add(cb.like(cb.lower(path.as(String.class)), "%" + filter.toLowerCase() + "%")); + for (String filterString : submissionListColumn.getFilters()) { + sqlWheresBuilder.append(" LOWER(oc").append(".name) LIKE '%").append(filterString.toLowerCase()).append("%' OR"); + } + + break; + + case "assignee.email": + + sqlJoinsBuilder.append("\nLEFT JOIN users a ON a.id=s.assignee_id"); + + if (submissionListColumn.getSortOrder() > 0) { + setColumnOrdering(submissionListColumn.getSort(), sqlSelectBuilder, sqlOrderBysBuilder, " a.email"); } - for (String filter : allColumnSearchFilters) { - if (submissionListColumn.getPredicate() != null) { - if (fieldValueFetchPath == null) { - fieldValueFetchPath = (Path) root.fetch("fieldValues"); - } - _filterPredicates.add(cb.like(cb.lower(fieldValueFetchPath.get("value").as(String.class)), "%" + filter.toLowerCase() + "%")); - } else { - _filterPredicates.add(cb.like(cb.lower(path.as(String.class)), "%" + filter.toLowerCase() + "%")); - } + for (String filterString : submissionListColumn.getFilters()) { + sqlWheresBuilder.append(" LOWER(a").append(".email) LIKE '%").append(filterString.toLowerCase()).append("%' OR"); + } + + break; + + case "embargoTypes.name": + + sqlJoinsBuilder + .append("\nLEFT JOIN") + .append("\n (SELECT *") + .append("\n FROM embargo e") + .append("\n LEFT JOIN submission_embargo_types semt") + .append("\n ON semt.embargo_types_id=e.id) embs") + .append("\n ON embs.submission_id=s.id"); + + if (submissionListColumn.getSortOrder() > 0) { + setColumnOrdering(submissionListColumn.getSort(), sqlSelectBuilder, sqlOrderBysBuilder, " embs.name"); } - switch (submissionListColumn.getSort()) { - case ASC: - _orders.add(cb.asc(path)); - break; - case DESC: - _orders.add(cb.desc(path)); - break; - default: - break; + for (String filterString : submissionListColumn.getFilters()) { + sqlWheresBuilder.append(" LOWER(embs").append(".name) LIKE '%").append(filterString.toLowerCase()).append("%' OR"); } - } - } + + break; + + default: System.out.println("No value path given for submissionListColumn " + submissionListColumn.getTitle()); + } - Predicate predicate = null; + } + } - if (_filterPredicates.size() == 0) { - predicate = cb.and(_groupPredicates.toArray(new Predicate[_groupPredicates.size()])); - } else { - predicate = cb.and(cb.and(_groupPredicates.toArray(new Predicate[_groupPredicates.size()])), cb.or(_filterPredicates.toArray(new Predicate[_filterPredicates.size()]))); - } + + // complete select clause + sqlSelectBuilder.setLength(sqlSelectBuilder.length() - 1); + sqlSelectBuilder.append(" FROM submission s"); + + // if ordering, complete order by clause and strip the tailing comma + if (sqlOrderBysBuilder.length() > 0) { + sqlOrderBysBuilder.insert(0, "\nORDER BY"); + sqlOrderBysBuilder.setLength(sqlOrderBysBuilder.length() - 1); + } - query.select(root).distinct(true).where(predicate).orderBy(_orders); + // if where, complete where clause and strip the tailing OR + if (sqlWheresBuilder.length() > 0) { + sqlWheresBuilder.insert(0, "\nWHERE"); + sqlWheresBuilder.setLength(sqlWheresBuilder.length() - 3); + } - TypedQuery typedQuery = em.createQuery(query); + String sqlQuery; - System.out.println("\n" + typedQuery.unwrap(Query.class).getQueryString() + "\n"); + if (pageable != null) { - long total = typedQuery.getResultList().size(); - typedQuery.setFirstResult(pageable.getOffset()); - typedQuery.setMaxResults(pageable.getPageSize()); + // determine the offset and limit of the query + int offset = pageable.getPageSize() * pageable.getPageNumber(); + int limit = pageable.getPageSize(); - pageResults = new PageImpl(typedQuery.getResultList(), pageable, total); + sqlQuery = sqlSelectBuilder.toString() + sqlJoinsBuilder.toString() + sqlWheresBuilder.toString() + sqlOrderBysBuilder.toString() + "\nLIMIT " + limit + " OFFSET " + offset + ";"; - // pageResults = submissionRepo.findAll(new SubmissionSpecification(allSubmissionListColumns, allColumnSearchFilters), new PageRequest(pageable.getPageNumber(), pageable.getPageSize())); - } else { - pageResults = submissionRepo.findAll(new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), new Sort(orders))); - } } else { - pageResults = submissionRepo.findAll(pageable); + sqlQuery = sqlSelectBuilder.toString() + sqlJoinsBuilder.toString() + sqlWheresBuilder.toString(); } - return pageResults; + String sqlCountQuery = sqlCountSelectBuilder.toString() + sqlJoinsBuilder.toString() + sqlWheresBuilder.toString(); + + + System.out.println("QUERY:\n" + sqlQuery); + + System.out.println("COUNT QUERY:\n" + sqlCountQuery); + + return new String[] { sqlQuery, sqlCountQuery }; } - private Boolean requiresFetch(Path path, String property) { - Field field = recursivelyFindField(path.getJavaType(), property); - Boolean reqFetch = true; - for (Annotation annotation : field.getAnnotations()) { - if (annotation instanceof Column || annotation instanceof Id) { - reqFetch = false; - } + public void setColumnOrdering(Sort sort, StringBuilder sqlSelectBuilder, StringBuilder sqlOrderBysBuilder, String value) { + sqlSelectBuilder.append(value).append(","); + switch (sort) { + case ASC: + sqlOrderBysBuilder.append(value).append(" ASC,"); + break; + case DESC: + sqlOrderBysBuilder.append(value).append(" DESC,"); + break; + default: + break; } - return reqFetch; } - + } diff --git a/src/main/java/org/tdl/vireo/model/repo/impl/UserRepoImpl.java b/src/main/java/org/tdl/vireo/model/repo/impl/UserRepoImpl.java index 8952d812a5..880d25498d 100644 --- a/src/main/java/org/tdl/vireo/model/repo/impl/UserRepoImpl.java +++ b/src/main/java/org/tdl/vireo/model/repo/impl/UserRepoImpl.java @@ -4,10 +4,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.tdl.vireo.enums.AppRole; -import org.tdl.vireo.model.NamedSearchFilter; +import org.tdl.vireo.model.NamedSearchFilterGroup; import org.tdl.vireo.model.SubmissionListColumn; import org.tdl.vireo.model.User; -import org.tdl.vireo.model.repo.NamedSearchFilterRepo; +import org.tdl.vireo.model.repo.NamedSearchFilterGroupRepo; import org.tdl.vireo.model.repo.UserRepo; import org.tdl.vireo.model.repo.custom.UserRepoCustom; @@ -17,7 +17,7 @@ public class UserRepoImpl implements UserRepoCustom { private UserRepo userRepo; @Autowired - private NamedSearchFilterRepo namedSearchFilterRepo; + private NamedSearchFilterGroupRepo namedSearchFilterRepo; @Override public User create(String email, String firstName, String lastName, AppRole role) { @@ -26,7 +26,7 @@ public User create(String email, String firstName, String lastName, AppRole role newUser = userRepo.save(newUser); - NamedSearchFilter activeFilter = namedSearchFilterRepo.create(newUser); + NamedSearchFilterGroup activeFilter = namedSearchFilterRepo.create(newUser); newUser.putSetting("id", newUser.getId().toString()); newUser.putSetting("displayName", newUser.getFirstName() + " " + newUser.getLastName()); diff --git a/src/main/java/org/tdl/vireo/service/SystemDataLoaderImpl.java b/src/main/java/org/tdl/vireo/service/SystemDataLoaderImpl.java index 2766555c72..325aeb6273 100644 --- a/src/main/java/org/tdl/vireo/service/SystemDataLoaderImpl.java +++ b/src/main/java/org/tdl/vireo/service/SystemDataLoaderImpl.java @@ -307,13 +307,15 @@ private List processWorkflowSteps(Organization organization, List< if (fieldPredicate == null) { fieldPredicate = fieldPredicateRepo.create(fieldProfile.getFieldPredicate().getValue(), fieldProfile.getFieldPredicate().getDocumentTypePredicate()); } + // check to see if the InputType exists InputType inputType = inputTypeRepo.findByName(fieldProfile.getInputType().getName()); if (inputType == null) { inputType = inputTypeRepo.create(fieldProfile.getInputType().getName()); - } + } + // temporary list of ControlledVocabulary diff --git a/src/main/resources/submission_list_columns/SYSTEM_Default_Submission_List_Column_Titles.json b/src/main/resources/submission_list_columns/SYSTEM_Default_Submission_List_Column_Titles.json index b02f2b3e19..205aa786aa 100644 --- a/src/main/resources/submission_list_columns/SYSTEM_Default_Submission_List_Column_Titles.json +++ b/src/main/resources/submission_list_columns/SYSTEM_Default_Submission_List_Column_Titles.json @@ -1 +1 @@ -["ID", "Last Name", "First Name", "Status", "Assigned to", "Title", "Submission title", "Submission date", "Approval date", "Embargo type"] \ No newline at end of file +["ID", "Last Name", "First Name", "Status", "Assigned to", "Title", "Submission date", "Approval date", "Embargo type"] \ No newline at end of file diff --git a/src/main/resources/submission_list_columns/SYSTEM_Default_Submission_List_Columns.json b/src/main/resources/submission_list_columns/SYSTEM_Default_Submission_List_Columns.json index e421cd369f..29baa48953 100644 --- a/src/main/resources/submission_list_columns/SYSTEM_Default_Submission_List_Columns.json +++ b/src/main/resources/submission_list_columns/SYSTEM_Default_Submission_List_Columns.json @@ -18,7 +18,7 @@ } }, { - "title": "Organization name", + "title": "Organization", "sort": "NONE", "valuePath": ["organization", "name"], "status": null, @@ -44,15 +44,6 @@ "name": "INPUT_TEXT" } }, - { - "title": "Submission title", - "sort": "NONE", - "valuePath": [], - "status": null, - "inputType": { - "name": "INPUT_TEXT" - } - }, { "title": "Submission date", "sort": "NONE", @@ -74,7 +65,7 @@ { "title": "Embargo type", "sort": "NONE", - "valuePath": [], + "valuePath": ["embargoTypes", "name"], "status": null, "inputType": { "name": "INPUT_TEXT" diff --git a/src/main/resources/submission_states/SYSTEM_Submission_States.json b/src/main/resources/submission_states/SYSTEM_Submission_States.json index 299dbbcd1c..873c27d170 100644 --- a/src/main/resources/submission_states/SYSTEM_Submission_States.json +++ b/src/main/resources/submission_states/SYSTEM_Submission_States.json @@ -5,7 +5,7 @@ "isDeletable": false, "isEditableByReviewer": false, "isEditableByStudent": false, - "isActive": false, + "isActive": null, "transitionSubmissionStates": [ { "name": "Submitted", diff --git a/src/main/webapp/WEB-INF/app/config/apiMapping.js b/src/main/webapp/WEB-INF/app/config/apiMapping.js index ae42ead021..5b38521a8e 100644 --- a/src/main/webapp/WEB-INF/app/config/apiMapping.js +++ b/src/main/webapp/WEB-INF/app/config/apiMapping.js @@ -731,7 +731,7 @@ var apiMapping = { 'controller': 'workflow-step' } }, - NamedSearchFilter: { + NamedSearchFilterGroup: { instantiate: { 'endpoint': '/private/queue', 'controller': 'submission-list', @@ -746,10 +746,14 @@ var apiMapping = { 'endpoint': '/channel', 'controller': 'active-filters' }, - removeFilter: { + addFilter: { 'endpoint': '/private/queue', 'controller': 'submission-list', - 'method': 'remove-filter-criterion' + 'method': 'add-filter-criterion' + }, + removeFilter: { + 'endpoint': '/private/queue', + 'controller': 'submission-list' }, clearFilters: { 'endpoint': '/private/queue', diff --git a/src/main/webapp/WEB-INF/app/controllers/submission/submissionListController.js b/src/main/webapp/WEB-INF/app/controllers/submission/submissionListController.js index 43dbaaea13..ce7dfed0d4 100644 --- a/src/main/webapp/WEB-INF/app/controllers/submission/submissionListController.js +++ b/src/main/webapp/WEB-INF/app/controllers/submission/submissionListController.js @@ -1,4 +1,4 @@ -vireo.controller("SubmissionListController", function ($controller, $filter, $q, $scope, NgTableParams, SubmissionRepo, SubmissionStateRepo, SubmissionListColumnRepo, ManagerSubmissionListColumnRepo, ManagerFilterColumnRepo, WsApi,SidebarService, NamedSearchFilter, SavedFilterRepo, UserRepo) { +vireo.controller("SubmissionListController", function (uibDateParser, $controller, $filter, $q, $scope, NgTableParams, EmbargoRepo, SubmissionRepo, SubmissionStateRepo, SubmissionListColumnRepo, ManagerSubmissionListColumnRepo, ManagerFilterColumnRepo, DocumentTypeRepo, OrganizationRepo, OrganizationCategoryRepo, WsApi,SidebarService, NamedSearchFilterGroup, SavedFilterRepo, UserRepo, CustomActionDefinitionRepo) { angular.extend(this, $controller('AbstractController', {$scope: $scope})); @@ -17,11 +17,20 @@ vireo.controller("SubmissionListController", function ($controller, $filter, $q, $scope.change = false; SubmissionStateRepo.ready().then(function() { - $scope.advancedfeaturesBox.newStatus = submissionStates[0]; + $scope.advancedfeaturesBox.newStatus = submissionStates[0]; + console.log(submissionStates); }); - + + var documentTypes = DocumentTypeRepo.getAll(); + var embargos = EmbargoRepo.getAll(); + var customActionDefinitions = CustomActionDefinitionRepo.getAll(); + var organizations = OrganizationRepo.getAll(); + var organizationCategories = OrganizationCategoryRepo.getAll(); var submissionStates = SubmissionStateRepo.getAll(); + console.log(embargos); + + var findFirstAssignable = function() { var firstAssignable; for(var i in allUsers) { @@ -101,7 +110,7 @@ vireo.controller("SubmissionListController", function ($controller, $filter, $q, $scope.filterChange = false; - $scope.activeFilters = new NamedSearchFilter(); + $scope.activeFilters = new NamedSearchFilterGroup(); $scope.savedFilters = SavedFilterRepo.getAll(); @@ -174,6 +183,45 @@ vireo.controller("SubmissionListController", function ($controller, $filter, $q, return $scope.filterChange; }; + var addDateFilter = function(column) { + + var dateValue = $scope.furtherFilterBy[column.title.split(" ").join("")].d1.toISOString(); + var dateGloss = $filter('date')($scope.furtherFilterBy[column.title.split(" ").join("")].d1, "MM/dd/yyyy"); + + dateValue += $scope.furtherFilterBy[column.title.split(" ").join("")].d2 ? "|"+$scope.furtherFilterBy[column.title.split(" ").join("")].d2.toISOString() : ""; + dateGloss += $scope.furtherFilterBy[column.title.split(" ").join("")].d2 ? " to "+$filter('date')($scope.furtherFilterBy[column.title.split(" ").join("")].d2, "MM/dd/yyyy") : ""; + + $scope.activeFilters.addFilter(column.title, dateValue, dateGloss).then(function() { + $scope.furtherFilterBy[column.title.split(" ").join("")] = ""; + query(); + }); + + }; + + var addFilter = function(column, gloss) { + $scope.activeFilters.addFilter(column.title, $scope.furtherFilterBy[column.title.split(" ").join("")], gloss).then(function() { + $scope.furtherFilterBy[column.title.split(" ").join("")] = ""; + query(); + }); + }; + + $scope.furtherFilterBy = { + "title": "Further Filter By:", + "viewUrl": "views/sideboxes/furtherFilterBy/furtherFilterBy.html", + "getFilterColumns": $scope.getFilterColumns, + "addFilter": addFilter, + "addDateFilter": addDateFilter, + "submissionStates": submissionStates, + "customActionDefinitions": customActionDefinitions, + "organizations": organizations, + "organizationCategories": organizationCategories, + "documentTypes": documentTypes, + "embargos": embargos, + "allUsers": allUsers, + "assignable": assignable, + "defaultLimit": 3 + }; + var query = function() { SubmissionRepo.query($scope.userColumns, $scope.pageNumber, $scope.pageSize).then(function(data) { @@ -195,7 +243,7 @@ vireo.controller("SubmissionListController", function ($controller, $filter, $q, SubmissionListColumnRepo.reset(); ManagerSubmissionListColumnRepo.reset(); - $q.all([SubmissionListColumnRepo.ready(), ManagerSubmissionListColumnRepo.ready(), ManagerFilterColumnRepo.ready()]).then(function(data) { + $q.all([SubmissionListColumnRepo.ready(), ManagerSubmissionListColumnRepo.ready(), ManagerFilterColumnRepo.ready()]).then(function() { ManagerSubmissionListColumnRepo.submissionListPageSize().then(function(data) { @@ -239,6 +287,7 @@ vireo.controller("SubmissionListController", function ($controller, $filter, $q, "removeFilter": $scope.removeFilter, "getUserById": $scope.getUserById }, + $scope.furtherFilterBy, $scope.advancedfeaturesBox ]); @@ -302,12 +351,30 @@ vireo.controller("SubmissionListController", function ($controller, $filter, $q, }); }; - var getValueFromArray = function(array, path, col) { + var getValueFromArray = function(array, col) { + var value = ""; for(var j in array) { - if(array[j].fieldPredicate.value == col.predicate) { - return array[j].value; + + var member = array[j]; + + if(member.fieldPredicate !== undefined) { + if(member.fieldPredicate.value == col.predicate) { + value = member.value; + } } + else { + var path = col.valuePath; + + var curr = member; + + for(var p=1;p 0 ? ", " + curr : curr; + } } + return value; }; $scope.getSubmissionProperty = function(row, col) { @@ -320,7 +387,7 @@ vireo.controller("SubmissionListController", function ($controller, $filter, $q, } else { if(value instanceof Array) { - return getValueFromArray(value, col.predicatePath, col); + return getValueFromArray(value, col); } else { if(value !== null) { diff --git a/src/main/webapp/WEB-INF/app/directives/stringToDateDirective.js b/src/main/webapp/WEB-INF/app/directives/stringToDateDirective.js index f93a77004f..7ca9f609c2 100644 --- a/src/main/webapp/WEB-INF/app/directives/stringToDateDirective.js +++ b/src/main/webapp/WEB-INF/app/directives/stringToDateDirective.js @@ -6,5 +6,5 @@ vireo.directive('stringtodate', function() { return Date.parse(fromModel); //converted }); } - } + }; }); \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/index.jsp b/src/main/webapp/WEB-INF/app/index.jsp index 98ce3b95d0..d3ac3b78fd 100644 --- a/src/main/webapp/WEB-INF/app/index.jsp +++ b/src/main/webapp/WEB-INF/app/index.jsp @@ -319,7 +319,7 @@ - + diff --git a/src/main/webapp/WEB-INF/app/model/namedSearchFilterGroup.js b/src/main/webapp/WEB-INF/app/model/namedSearchFilterGroup.js new file mode 100644 index 0000000000..16fbc8b21b --- /dev/null +++ b/src/main/webapp/WEB-INF/app/model/namedSearchFilterGroup.js @@ -0,0 +1,58 @@ +vireo.model("NamedSearchFilterGroup", function (WsApi) { + + return function NamedSearchFilterGroup() { + var namedSearchFilterGroup = this; + + namedSearchFilterGroup.set = function(filter) { + + angular.extend(apiMapping.NamedSearchFilterGroup.setFilter, { + "data": filter + }); + + var promise = WsApi.fetch(namedSearchFilterGroup.getMapping().setFilter); + + return promise; + }; + + namedSearchFilterGroup.addFilter = function(criterionName, filterValue, filterGloss) { + + angular.extend(apiMapping.NamedSearchFilterGroup.addFilter, { + "data": { + "criterionName":criterionName, + "filterValue":filterValue, + "filterGloss":filterGloss + } + }); + + var promise = WsApi.fetch(namedSearchFilterGroup.getMapping().addFilter); + + return promise; + + }; + + namedSearchFilterGroup.removeFilter = function(namedSearchFilterName, filterCriterion) { + + console.log(namedSearchFilterName); + console.log(filterCriterion); + + angular.extend(apiMapping.NamedSearchFilterGroup.removeFilter, { + 'method': 'remove-filter-criterion/'+namedSearchFilterName, + "data": filterCriterion + }); + + console.log(apiMapping.NamedSearchFilterGroup.removeFilter); + + var promise = WsApi.fetch(namedSearchFilterGroup.getMapping().removeFilter); + + return promise; + }; + + namedSearchFilterGroup.clearFilters = function() { + var promise = WsApi.fetch(namedSearchFilterGroup.getMapping().clearFilters); + return promise; + }; + + return namedSearchFilterGroup; + }; + +}); \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/resources/styles/sass/app.scss b/src/main/webapp/WEB-INF/app/resources/styles/sass/app.scss index 11089f614f..b62208b4f1 100644 --- a/src/main/webapp/WEB-INF/app/resources/styles/sass/app.scss +++ b/src/main/webapp/WEB-INF/app/resources/styles/sass/app.scss @@ -427,7 +427,7 @@ sidebox .heading-text { } .sidebox-body.expanded { - max-height: 500px; + max-height: 5000px; transition: max-height 0.35s ease-out; } @@ -1667,7 +1667,7 @@ footer a, footer li, footer p { // Now Filtering By Side Module .now-filtering-by .glyphicon { - font-size: 0.75em; + color: #CD7674; } .now-filtering-by a { @@ -1682,3 +1682,84 @@ footer a, footer li, footer p { .filter-options ul.saved-filters ul.list li.columns:hover { text-decoration: underline; } + +.further-filter-by .status-category { + background: #CCCCCC; + display: inline-block +} + +.further-filter-by .status-category:hover { + cursor: pointer; +} + +.further-filter-by .inactive-filters-sub-list, +.further-filter-by .status-list, +.further-filter-by .document-type-list, +.further-filter-by .organization-by-category-sub-list { + max-height: 0px; + overflow: hidden; + -webkit-transition: max-height 0.5s ease-out; + transition: max-height 0.5s ease-out; +} + +.further-filter-by .status-list li { + margin-left: -25px; +} + +.further-filter-by .filter:hover { + text-decoration: underline; + cursor: pointer; +} + +.further-filter-by .inactive-filters-sub-list.expanded, +.further-filter-by .document-type-list.expanded, +.further-filter-by .status-list.expanded, +.further-filter-by .organization-by-category-sub-list.expanded { + max-height: 1000px; + -webkit-transition: max-height 0.5s ease-in; + transition: max-height 0.5s ease-in; +} + +.further-filter-by .more-less, +.further-filter-by .document-level, +.further-filter-by .organization-category { + margin-top: 15px; + margin-bottom: 10px; + background: #CCCCCC; + display: inline-block +} + +.further-filter-by .more-less:hover, +.further-filter-by .organization-category { + cursor:pointer; +} + +.further-filter-by div[uib-datepicker-popup-wrap] { + position: fixed; + bottom: 0px; + left: 0; + z-index: 9999999; +} + +.further-filter-by .date-range-divider { + text-align: center; + margin: 5px 0px; +} + +.further-filter-by .add-date-filter-btn, { + margin: 5px 0px 20px; +} + +.further-filter-by .document-type-filter-list { + max-height: 0 +} + +.further-filter-by .embargo-filter, +.further-filter-by .document-type-filter, +.further-filter-by .organization-filter { + margin-left: -20px; +} + +.further-filter-by .organization-by-category-top-list { + margin: 0px; +} diff --git a/src/main/webapp/WEB-INF/app/views/inputtype/input-datetime.html b/src/main/webapp/WEB-INF/app/views/inputtype/input-datetime.html index 9f8a752baf..e944f3f914 100644 --- a/src/main/webapp/WEB-INF/app/views/inputtype/input-datetime.html +++ b/src/main/webapp/WEB-INF/app/views/inputtype/input-datetime.html @@ -3,14 +3,14 @@ diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterBy.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterBy.html new file mode 100644 index 0000000000..78e5b29d6b --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterBy.html @@ -0,0 +1,48 @@ +
+ {{column.title}} + +
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByAssignedTo.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByAssignedTo.html new file mode 100644 index 0000000000..3f2f3be674 --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByAssignedTo.html @@ -0,0 +1,13 @@ +
+
    +
  • + Unassigned +
  • +
  • + {{assignee.settings.displayName}} +
  • +
  • more...
  • +
  • less...
  • +
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByCustomActions.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByCustomActions.html new file mode 100644 index 0000000000..983ab66c60 --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByCustomActions.html @@ -0,0 +1,7 @@ +
+
    +
  • {{customActionDefinitions.label}}
  • +
  • more...
  • +
  • less...
  • +
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByDate.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByDate.html new file mode 100644 index 0000000000..e41624a5e4 --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByDate.html @@ -0,0 +1,47 @@ +
+ +
+ + + + + + + +
+ +

— TO —

+ +
+ + + + + + + +
+ + + +
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByDefault.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByDefault.html new file mode 100644 index 0000000000..7ab4d10826 --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByDefault.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByDocumentType.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByDocumentType.html new file mode 100644 index 0000000000..ca90c139f8 --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByDocumentType.html @@ -0,0 +1,29 @@ +
+
    +
  • -+ Doctoral...
  • +
  • +
      +
    • {{dt.name}}
    • +
    +
  • +
  • -+ Masters...
  • +
  • +
      +
    • {{dt.name}}
    • +
    +
  • +
  • -+ Bachelors...
  • +
  • +
      +
    • {{dt.name}}
    • +
    +
  • +
  • -+ Other...
  • +
  • +
      +
    • {{dt.name}}
    • +
    +
  • + +
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByEmbargoType.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByEmbargoType.html new file mode 100644 index 0000000000..ea1ff67659 --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByEmbargoType.html @@ -0,0 +1,17 @@ +
+
    +
  • {{et.name}}
  • +
  • more...
  • +
  • less...
  • +
+ +
    +
  • +- Inactive
  • +
  • +
      +
    • {{et.name}}
    • +
    +
  • +
+ +
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByOrganization.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByOrganization.html new file mode 100644 index 0000000000..91d6bc701f --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByOrganization.html @@ -0,0 +1,10 @@ +
+
    +
  • +- {{c.name}}
  • +
  • +
      +
    • {{o.name}}
    • +
    +
  • +
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByOrganizationCategory.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByOrganizationCategory.html new file mode 100644 index 0000000000..239a26775c --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByOrganizationCategory.html @@ -0,0 +1,7 @@ +
+
    +
  • {{organizationCategory.name}}
  • +
  • more...
  • +
  • less...
  • +
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByStatus.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByStatus.html new file mode 100644 index 0000000000..896c622c8c --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByStatus.html @@ -0,0 +1,21 @@ +
+
    +
  • {{ss.name}}
  • + +
  • + Active
  • + +
  • +
      +
    • {{ss.name}}
    • +
    +
  • + +
  • + Archived
  • + +
  • +
      +
    • {{ss.name}}
    • +
    +
  • +
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByUmiPublication.html b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByUmiPublication.html new file mode 100644 index 0000000000..37645d65ec --- /dev/null +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/furtherFilterBy/furtherFilterByUmiPublication.html @@ -0,0 +1,6 @@ +
+
    +
  • Yes
  • +
  • No
  • +
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/app/views/sideboxes/nowfiltering.html b/src/main/webapp/WEB-INF/app/views/sideboxes/nowfiltering.html index 12100d5550..f8c0f08fab 100644 --- a/src/main/webapp/WEB-INF/app/views/sideboxes/nowfiltering.html +++ b/src/main/webapp/WEB-INF/app/views/sideboxes/nowfiltering.html @@ -1,7 +1,10 @@ - -
- {{filterCriterion.name}} +
+ {{namedSearchFilter.name}}
\ No newline at end of file diff --git a/src/test/java/org/tdl/vireo/integration/AuthIntegrationTest.java b/src/test/java/org/tdl/vireo/integration/AuthIntegrationTest.java index 7e94b8fae1..aeabd176b4 100644 --- a/src/test/java/org/tdl/vireo/integration/AuthIntegrationTest.java +++ b/src/test/java/org/tdl/vireo/integration/AuthIntegrationTest.java @@ -17,7 +17,7 @@ import org.tdl.vireo.enums.AppRole; import org.tdl.vireo.mock.interceptor.MockChannelInterceptor; import org.tdl.vireo.model.repo.EmailTemplateRepo; -import org.tdl.vireo.model.repo.NamedSearchFilterRepo; +import org.tdl.vireo.model.repo.NamedSearchFilterGroupRepo; import org.tdl.vireo.model.repo.UserRepo; import com.fasterxml.jackson.databind.JsonNode; @@ -36,7 +36,7 @@ public class AuthIntegrationTest extends AbstractIntegrationTest { private AuthUtility authUtility; @Autowired - private NamedSearchFilterRepo namedSearchFilterRepo; + private NamedSearchFilterGroupRepo namedSearchFilterRepo; @Override public void setup() { diff --git a/src/test/java/org/tdl/vireo/integration/LanguageIntegrationTest.java b/src/test/java/org/tdl/vireo/integration/LanguageIntegrationTest.java index 8038cd830b..6aa91536cb 100644 --- a/src/test/java/org/tdl/vireo/integration/LanguageIntegrationTest.java +++ b/src/test/java/org/tdl/vireo/integration/LanguageIntegrationTest.java @@ -13,7 +13,7 @@ import org.tdl.vireo.mock.interceptor.MockChannelInterceptor; import org.tdl.vireo.model.Language; import org.tdl.vireo.model.repo.LanguageRepo; -import org.tdl.vireo.model.repo.NamedSearchFilterRepo; +import org.tdl.vireo.model.repo.NamedSearchFilterGroupRepo; import org.tdl.vireo.model.repo.UserRepo; import com.fasterxml.jackson.core.JsonParseException; @@ -29,7 +29,7 @@ public class LanguageIntegrationTest extends AbstractIntegrationTest { private UserRepo userRepo; @Autowired - private NamedSearchFilterRepo namedSearchFilterRepo; + private NamedSearchFilterGroupRepo namedSearchFilterRepo; @Override public void setup() { diff --git a/src/test/java/org/tdl/vireo/integration/UserIntegrationTest.java b/src/test/java/org/tdl/vireo/integration/UserIntegrationTest.java index f183087519..7c22953ec2 100644 --- a/src/test/java/org/tdl/vireo/integration/UserIntegrationTest.java +++ b/src/test/java/org/tdl/vireo/integration/UserIntegrationTest.java @@ -18,7 +18,7 @@ import org.tdl.vireo.enums.AppRole; import org.tdl.vireo.mock.interceptor.MockChannelInterceptor; import org.tdl.vireo.model.User; -import org.tdl.vireo.model.repo.NamedSearchFilterRepo; +import org.tdl.vireo.model.repo.NamedSearchFilterGroupRepo; import org.tdl.vireo.model.repo.UserRepo; import com.fasterxml.jackson.core.type.TypeReference; @@ -31,7 +31,7 @@ public class UserIntegrationTest extends AbstractIntegrationTest { private UserRepo userRepo; @Autowired - private NamedSearchFilterRepo namedSearchFilterRepo; + private NamedSearchFilterGroupRepo namedSearchFilterRepo; @Override public void setup() { diff --git a/src/test/java/org/tdl/vireo/model/AbstractEntityTest.java b/src/test/java/org/tdl/vireo/model/AbstractEntityTest.java index 0beaa16644..25275eb74f 100644 --- a/src/test/java/org/tdl/vireo/model/AbstractEntityTest.java +++ b/src/test/java/org/tdl/vireo/model/AbstractEntityTest.java @@ -35,7 +35,7 @@ import org.tdl.vireo.model.repo.FieldValueRepo; import org.tdl.vireo.model.repo.InputTypeRepo; import org.tdl.vireo.model.repo.LanguageRepo; -import org.tdl.vireo.model.repo.NamedSearchFilterRepo; +import org.tdl.vireo.model.repo.NamedSearchFilterGroupRepo; import org.tdl.vireo.model.repo.NoteRepo; import org.tdl.vireo.model.repo.OrganizationCategoryRepo; import org.tdl.vireo.model.repo.OrganizationRepo; @@ -394,7 +394,7 @@ public abstract class AbstractEntityTest { protected OrganizationRepo organizationRepo; @Autowired - protected NamedSearchFilterRepo namedSearchFilterRepo; + protected NamedSearchFilterGroupRepo namedSearchFilterRepo; @Autowired protected EntityCVWhitelistRepo entityCVWhitelistRepo; diff --git a/src/test/java/org/tdl/vireo/model/ActionLogTest.java b/src/test/java/org/tdl/vireo/model/ActionLogTest.java index 7b0bdd0d93..9a16c0530b 100644 --- a/src/test/java/org/tdl/vireo/model/ActionLogTest.java +++ b/src/test/java/org/tdl/vireo/model/ActionLogTest.java @@ -5,8 +5,6 @@ import org.junit.After; import org.junit.Before; -import edu.tamu.framework.model.Credentials; - public class ActionLogTest extends AbstractEntityTest { @Before @@ -22,11 +20,11 @@ public void setUp() { attachment = attachmentRepo.create(TEST_ATTACHMENT_NAME, TEST_UUID, attachmentType); assertEquals("The attachment repository is not empty!", 1, attachmentRepo.count()); - Credentials credentials = new Credentials(); - credentials.setEmail(testUser.getEmail()); OrganizationCategory category = organizationCategoryRepo.create(TEST_ORGANIZATION_CATEGORY_NAME); Organization organization = organizationRepo.create(TEST_ORGANIZATION_NAME, category); + testSubmission = submissionRepo.create(testUser, organization, submissionState); + assertEquals("The submission repository is not empty!", 1, submissionRepo.count()); } diff --git a/src/test/java/org/tdl/vireo/model/CustomActionValueTest.java b/src/test/java/org/tdl/vireo/model/CustomActionValueTest.java index c9243ac2e0..d1dbd75b26 100644 --- a/src/test/java/org/tdl/vireo/model/CustomActionValueTest.java +++ b/src/test/java/org/tdl/vireo/model/CustomActionValueTest.java @@ -5,8 +5,6 @@ import org.junit.After; import org.junit.Before; -import edu.tamu.framework.model.Credentials; - public class CustomActionValueTest extends AbstractEntityTest { @Before @@ -20,10 +18,10 @@ public void setUp() { submissionState = submissionStateRepo.create(TEST_SUBMISSION_STATE_NAME, TEST_SUBMISSION_STATE_ARCHIVED, TEST_SUBMISSION_STATE_PUBLISHABLE, TEST_SUBMISSION_STATE_DELETABLE, TEST_SUBMISSION_STATE_EDITABLE_BY_REVIEWER, TEST_SUBMISSION_STATE_EDITABLE_BY_STUDENT, TEST_SUBMISSION_STATE_ACTIVE); assertEquals("The submissionState repository is not empty!", 1, submissionStateRepo.count()); - Credentials credentials = new Credentials(); - credentials.setEmail(testUser.getEmail()); Organization organization = organizationRepo.create(TEST_ORGANIZATION_NAME, organizationCategoryRepo.create(TEST_ORGANIZATION_CATEGORY_NAME)); + testSubmission = submissionRepo.create(testUser, organization, submissionState); + assertEquals("The submission repository is not empty!", 1, submissionRepo.count()); testCustomActionDefinition = customActionDefinitionRepo.create(TEST_CUSTOM_ACTION_DEFINITION_LABEL, TEST_CUSTOM_ACTION_DEFINITION_VISIBLE_BY_STUDENT); diff --git a/src/test/java/org/tdl/vireo/model/DocumentTypeTest.java b/src/test/java/org/tdl/vireo/model/DocumentTypeTest.java index 4cc44155c0..c8ba27c256 100644 --- a/src/test/java/org/tdl/vireo/model/DocumentTypeTest.java +++ b/src/test/java/org/tdl/vireo/model/DocumentTypeTest.java @@ -8,8 +8,6 @@ import org.springframework.dao.DataIntegrityViolationException; import org.tdl.vireo.enums.DegreeLevel; -import edu.tamu.framework.model.Credentials; - public class DocumentTypeTest extends AbstractEntityTest{ @Override @@ -60,14 +58,14 @@ public void testDeleteDocumentTypeWhileSubmissionReferencesPredicate() { // Create a submission. submitter = userRepo.create(TEST_SUBMISSION_SUBMITTER_EMAIL, TEST_SUBMISSION_SUBMITTER_FIRSTNAME, TEST_SUBMISSION_SUBMITTER_LASTNAME, TEST_SUBMISSION_SUBMITTER_ROLE); assertEquals("The user does not exist!", 1, userRepo.count()); - Credentials creds = new Credentials(); - creds.setEmail(submitter.getEmail()); + OrganizationCategory parentCategory = organizationCategoryRepo.create(TEST_CATEGORY_NAME); assertEquals("The category does not exist!", 1, organizationCategoryRepo.count()); organization = organizationRepo.create(TEST_ORGANIZATION_NAME, parentCategory); parentCategory = organizationCategoryRepo.findOne(parentCategory.getId()); assertEquals("The organization does not exist!", 1, organizationRepo.count()); + Submission submission = submissionRepo.create(submitter, organization, submissionState); // Create a document type with implicitly created field predicate. diff --git a/src/test/java/org/tdl/vireo/model/SubmissionTest.java b/src/test/java/org/tdl/vireo/model/SubmissionTest.java index bba9d66edc..2d7338a2f3 100644 --- a/src/test/java/org/tdl/vireo/model/SubmissionTest.java +++ b/src/test/java/org/tdl/vireo/model/SubmissionTest.java @@ -61,6 +61,7 @@ public void setUp() { @Override public void testCreate() { + Submission submission = submissionRepo.create(submitter, organization, submissionState); submission.addSubmissionWorkflowStep(submissionWorkflowStep); @@ -84,17 +85,21 @@ public void testCreate() { @Override public void testDuplication() { + submissionRepo.create(submitter, organization, submissionState); assertEquals("The repository didn't persist submission!", 1, submissionRepo.count()); try { submissionRepo.create(submitter, organization, submissionState); } catch (DataIntegrityViolationException e) { /* SUCCESS */ } + assertEquals("The repository duplicated the submission!", 1, submissionRepo.count()); } @Override public void testDelete() { + Submission submission = submissionRepo.create(submitter, organization, submissionState); + submissionRepo.delete(submission); assertEquals("Submission did not delete!", 0, submissionRepo.count()); } @@ -114,6 +119,7 @@ public void testCascade() { severableFieldValue.setValue("Remove me from the submission!"); Long severableFieldValueId = severableFieldValue.getId(); + Submission submission = submissionRepo.create(submitter, organization, submissionState); ActionLog severableActionLog = actionLogRepo.create(submission, submissionState, submitter, TEST_SUBMISSION_STATE_ACTION_LOG_ACTION_DATE, attachment, TEST_SUBMISSION_STATE_ACTION_LOG_ENTRY, TEST_SUBMISSION_STATE_ACTION_LOG_FLAG); @@ -189,6 +195,7 @@ public void testCascade() { @Test public void testUniqueConstraint() { + Submission submission = submissionRepo.create(submitter, organization, submissionState); submission.addSubmissionWorkflowStep(submissionWorkflowStep); @@ -203,6 +210,7 @@ public void testUniqueConstraint() { assertEquals("The submission was not retrievable by its unique constraint!", submission, submissionRepo.findBySubmitterAndOrganization(submitter, organization)); try { + submissionRepo.create(submitter, organization, submissionState); assertTrue(false); } catch (Exception e) {