Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge remote-tracking branch 'origin/develop' into feature/OCE-492_Frequent_supplier_bidding_combinations #599

Open
wants to merge 4 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package org.devgateway.ocds.web.annotate;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

/**
* Created by mpostelnicu on 2/17/17.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.devgateway.ocds.web.annotate;

import cz.jirutka.validator.collection.constraints.EachPattern;
import org.hibernate.validator.constraints.NotEmpty;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;

/**
* Created by mpostelnicu
*/

@Retention(RetentionPolicy.RUNTIME)
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Documented
@EachPattern(regexp = "^[a-zA-Z0-9\\-]*$", message = "Invalid organization id!")
@Constraint(validatedBy = {})
@NotEmpty
public @interface OrganizationIdValidation {

String message() default "Organization Id is not valid";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.swagger.annotations.ApiOperation;
import org.devgateway.ocds.persistence.mongo.Award;
import org.devgateway.ocds.persistence.mongo.constants.MongoConstants;
import org.devgateway.ocds.web.rest.controller.request.WinningTupleYearFilterPagingRequest;
import org.devgateway.ocds.web.rest.controller.request.YearFilterPagingRequest;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
Expand All @@ -31,6 +32,7 @@

import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;

import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.limit;
Expand Down Expand Up @@ -122,4 +124,38 @@ public List<DBObject> activeAwardsCount(@ModelAttribute @Valid final YearFilterP
return releaseAgg(agg);
}

@ApiOperation(value = "Counts the tenders/awards where the given supplier id is among the winners. "
+ "This assumes there is only one active award, which always seems to be the case, per tender. ")
@RequestMapping(value = "/api/tendererTupleActiveAwardsCount",
method = {RequestMethod.POST, RequestMethod.GET},
produces = "application/json")
public List<DBObject> tendererTupleActiveAwardsCount(@ModelAttribute @Valid
final WinningTupleYearFilterPagingRequest filter) {

List<Criteria> metaFilter = filter.getTendererTuple()
.stream()
.map(t -> where("bids.details.tenderers._id").is(t))
.collect(Collectors.toList());

metaFilter.add(getYearDefaultFilterCriteria(filter, MongoConstants.FieldNames.TENDER_PERIOD_START_DATE));

Aggregation agg = newAggregation(
match(where(MongoConstants.FieldNames.AWARDS_STATUS).is(Award.Status.active.toString())
.andOperator(metaFilter.toArray(new Criteria[0]))),
unwind("awards"),
match(where(MongoConstants.FieldNames.AWARDS_STATUS).is(Award.Status.active.toString())
.andOperator(getYearDefaultFilterCriteria(
filter.awardFiltering(),
MongoConstants.FieldNames.TENDER_PERIOD_START_DATE
))),
unwind("awards.suppliers"),
group(MongoConstants.FieldNames.AWARDS_SUPPLIERS_ID).count().as("cnt"),
project("cnt").and(Fields.UNDERSCORE_ID).as("supplierId")
.andExclude(Fields.UNDERSCORE_ID)
);

return releaseAgg(agg);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import cz.jirutka.validator.collection.constraints.EachPattern;
import cz.jirutka.validator.collection.constraints.EachRange;
import io.swagger.annotations.ApiModelProperty;
import org.devgateway.ocds.web.annotate.OrganizationIdValidation;

import java.math.BigDecimal;
import java.util.TreeSet;
Expand All @@ -31,17 +32,17 @@ public class DefaultFilterPagingRequest extends GenericPagingRequest {
"This corresponds the negated bidTypeId filter, matches elements that are NOT in the TreeSet of Ids")
private TreeSet<String> notBidTypeId;

@EachPattern(regexp = "^[a-zA-Z0-9\\-]*$")
@OrganizationIdValidation
@ApiModelProperty(value = "This is the id of the organization/procuring entity. "
+ "Corresponds to the OCDS Organization.identifier")
private TreeSet<String> procuringEntityId;

@EachPattern(regexp = "^[a-zA-Z0-9\\-]*$")
@OrganizationIdValidation
@ApiModelProperty(value = "This corresponds the negated procuringEntityId filter,"
+ " matches elements that are NOT in the TreeSet of Ids")
private TreeSet<String> notProcuringEntityId;

@EachPattern(regexp = "^[a-zA-Z0-9\\-]*$")
@OrganizationIdValidation
@ApiModelProperty(value = "This is the id of the organization/supplier entity. "
+ "Corresponds to the OCDS Organization.identifier")
private TreeSet<String> supplierId;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/**
*
*/
package org.devgateway.ocds.web.rest.controller.request;

import io.swagger.annotations.ApiModelProperty;
import org.devgateway.ocds.web.annotate.OrganizationIdValidation;

import java.util.TreeSet;

/**
* @author mpostelnicu
*
*/
public class WinningTupleYearFilterPagingRequest extends YearFilterPagingRequest {

@OrganizationIdValidation
@ApiModelProperty(value = "This is a tuple of tenderers among which one was part of a winning award")
private TreeSet<String> tendererTuple;

public TreeSet<String> getTendererTuple() {
return tendererTuple;
}

public void setTendererTuple(TreeSet<String> tendererTuple) {
this.tendererTuple = tendererTuple;
}
}