use of org.pmiops.workbench.exceptions.BadRequestException in project workbench by all-of-us.
the class FieldSetQueryBuilder method handleComparison.
private void handleComparison(ColumnFilter columnFilter, ColumnConfig columnConfig, StringBuilder sqlBuilder, Map<String, QueryParameterValue> paramMap) {
String paramName = "p" + paramMap.size();
Operator operator = columnFilter.getOperator();
if (columnFilter.getValueNumbers() != null || columnFilter.getValues() != null) {
throw new BadRequestException("Can't use valueNumbers or values with operator " + operator);
}
if (!((columnFilter.getValue() != null) ^ (columnFilter.getValueDate() != null) ^ (columnFilter.getValueNumber() != null) ^ (columnFilter.getValueNull() != null && columnFilter.getValueNull()))) {
throw new BadRequestException("Exactly one of value, valueDate, valueNumber, and valueNull " + "must be specified for filter on column " + columnConfig.name);
}
if (operator.equals(Operator.LIKE) && columnFilter.getValue() == null) {
throw new BadRequestException("LIKE operator only support with value");
}
if (columnFilter.getValue() != null) {
if (!columnConfig.type.equals(ColumnType.STRING)) {
throw new BadRequestException("Can't use value with column " + columnConfig.name + " of type " + columnConfig.type);
}
paramMap.put(paramName, QueryParameterValue.string(columnFilter.getValue()));
} else if (columnFilter.getValueDate() != null) {
if (columnConfig.type.equals(ColumnType.DATE)) {
try {
DATE_FORMAT.parse(columnFilter.getValueDate());
paramMap.put(paramName, QueryParameterValue.date(columnFilter.getValueDate()));
} catch (ParseException e) {
throw new BadRequestException("Couldn't parse date value " + columnFilter.getValueDate() + "; expected format: " + DATE_FORMAT_PATTERN);
}
} else if (columnConfig.type.equals(ColumnType.TIMESTAMP)) {
try {
long timestamp = DATE_TIME_FORMAT.parseDateTime(columnFilter.getValueDate()).getMillis() * 1000;
paramMap.put(paramName, QueryParameterValue.timestamp(timestamp));
} catch (IllegalArgumentException e) {
throw new BadRequestException("Couldn't parse timestamp value " + columnFilter.getValueDate() + "; expected format: " + DATE_TIME_FORMAT_PATTERN);
}
} else {
throw new BadRequestException("Can't use valueDate with column " + columnConfig.name + " of type " + columnConfig.type);
}
} else if (columnFilter.getValueNumber() != null) {
if (columnConfig.type.equals(ColumnType.FLOAT)) {
paramMap.put(paramName, QueryParameterValue.float64(columnFilter.getValueNumber().doubleValue()));
} else if (columnConfig.type.equals(ColumnType.INTEGER)) {
paramMap.put(paramName, QueryParameterValue.int64(columnFilter.getValueNumber().longValue()));
} else {
throw new BadRequestException("Can't use valueNumber with column " + columnConfig.name + " of type " + columnConfig.type);
}
} else if (columnFilter.getValueNull() != null && columnFilter.getValueNull()) {
if (operator != Operator.EQUAL) {
throw new BadRequestException("Unsupported operator for valueNull: " + operator);
}
sqlBuilder.append(columnFilter.getColumnName());
sqlBuilder.append(" is null\n");
return;
}
sqlBuilder.append(columnFilter.getColumnName());
sqlBuilder.append(' ');
sqlBuilder.append(OperatorUtils.getSqlOperator(columnFilter.getOperator()));
sqlBuilder.append(" @");
sqlBuilder.append(paramName);
sqlBuilder.append("\n");
}
use of org.pmiops.workbench.exceptions.BadRequestException in project workbench by all-of-us.
the class ParticipantCounter method buildQuery.
public QueryJobConfiguration buildQuery(ParticipantCriteria participantCriteria, String sqlTemplate, String endSql, String mainTable, Map<String, QueryParameterValue> params) {
SearchRequest request = participantCriteria.getSearchRequest();
StringBuilder queryBuilder = new StringBuilder(sqlTemplate.replace("${mainTable}", mainTable));
if (request == null) {
queryBuilder.append(PERSON_ID_WHITELIST_TEMPLATE.replace("${mainTable}", mainTable));
params.put(PERSON_ID_WHITELIST_PARAM, QueryParameterValue.array(participantCriteria.getParticipantIdsToInclude().toArray(new Long[0]), Long.class));
} else {
domainLookupService.findCodesForEmptyDomains(request.getIncludes());
domainLookupService.findCodesForEmptyDomains(request.getExcludes());
if (request.getIncludes().isEmpty() && request.getExcludes().isEmpty()) {
throw new BadRequestException("Invalid SearchRequest: includes[] and excludes[] cannot both be empty");
}
// build query for included search groups
StringJoiner joiner = buildQuery(request.getIncludes(), mainTable, params, false);
// if includes is empty then don't add the excludes clause
if (joiner.toString().isEmpty()) {
joiner.merge(buildQuery(request.getExcludes(), mainTable, params, false));
} else {
joiner.merge(buildQuery(request.getExcludes(), mainTable, params, true));
}
Set<Long> participantIdsToExclude = participantCriteria.getParticipantIdsToExclude();
if (!participantIdsToExclude.isEmpty()) {
joiner.add(PERSON_ID_BLACKLIST_TEMPLATE.replace("${mainTable}", mainTable));
params.put(PERSON_ID_BLACKLIST_PARAM, QueryParameterValue.array(participantIdsToExclude.toArray(new Long[0]), Long.class));
}
queryBuilder.append(joiner.toString());
}
queryBuilder.append(endSql.replace("${mainTable}", mainTable));
return QueryJobConfiguration.newBuilder(queryBuilder.toString()).setNamedParameters(params).setUseLegacySql(false).build();
}
use of org.pmiops.workbench.exceptions.BadRequestException in project workbench by all-of-us.
the class CohortReviewServiceImpl method validateParticipantCohortAnnotation.
/**
* Helper method to validate that requested annotations are proper.
*
* @param participantCohortAnnotation
*/
private void validateParticipantCohortAnnotation(ParticipantCohortAnnotation participantCohortAnnotation, CohortAnnotationDefinition cohortAnnotationDefinition) {
if (cohortAnnotationDefinition.getAnnotationType().equals(AnnotationType.BOOLEAN)) {
if (participantCohortAnnotation.getAnnotationValueBoolean() == null) {
throw createBadRequestException(AnnotationType.BOOLEAN.name(), participantCohortAnnotation.getCohortAnnotationDefinitionId());
}
} else if (cohortAnnotationDefinition.getAnnotationType().equals(AnnotationType.STRING)) {
if (StringUtils.isBlank(participantCohortAnnotation.getAnnotationValueString())) {
throw createBadRequestException(AnnotationType.STRING.name(), participantCohortAnnotation.getCohortAnnotationDefinitionId());
}
} else if (cohortAnnotationDefinition.getAnnotationType().equals(AnnotationType.DATE)) {
if (StringUtils.isBlank(participantCohortAnnotation.getAnnotationValueDateString())) {
throw createBadRequestException(AnnotationType.DATE.name(), participantCohortAnnotation.getCohortAnnotationDefinitionId());
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = new Date(sdf.parse(participantCohortAnnotation.getAnnotationValueDateString()).getTime());
participantCohortAnnotation.setAnnotationValueDate(date);
} catch (ParseException e) {
throw new BadRequestException(String.format("Invalid Request: Please provide a valid %s value (%s) for annotation defintion id: %s", AnnotationType.DATE.name(), sdf.toPattern(), participantCohortAnnotation.getCohortAnnotationDefinitionId()));
}
} else if (cohortAnnotationDefinition.getAnnotationType().equals(AnnotationType.INTEGER)) {
if (participantCohortAnnotation.getAnnotationValueInteger() == null) {
throw createBadRequestException(AnnotationType.INTEGER.name(), participantCohortAnnotation.getCohortAnnotationDefinitionId());
}
} else if (cohortAnnotationDefinition.getAnnotationType().equals(AnnotationType.ENUM)) {
if (StringUtils.isBlank(participantCohortAnnotation.getAnnotationValueEnum())) {
throw createBadRequestException(AnnotationType.ENUM.name(), participantCohortAnnotation.getCohortAnnotationDefinitionId());
}
List<CohortAnnotationEnumValue> enumValues = cohortAnnotationDefinition.getEnumValues().stream().filter(enumValue -> participantCohortAnnotation.getAnnotationValueEnum().equals(enumValue.getName())).collect(Collectors.toList());
if (enumValues.isEmpty()) {
throw createBadRequestException(AnnotationType.ENUM.name(), participantCohortAnnotation.getCohortAnnotationDefinitionId());
}
participantCohortAnnotation.setCohortAnnotationEnumValue(enumValues.get(0));
}
}
use of org.pmiops.workbench.exceptions.BadRequestException in project workbench by all-of-us.
the class CohortReviewServiceImpl method saveParticipantCohortAnnotation.
@Override
public ParticipantCohortAnnotation saveParticipantCohortAnnotation(Long cohortReviewId, ParticipantCohortAnnotation participantCohortAnnotation) {
CohortAnnotationDefinition cohortAnnotationDefinition = findCohortAnnotationDefinition(participantCohortAnnotation.getCohortAnnotationDefinitionId());
validateParticipantCohortAnnotation(participantCohortAnnotation, cohortAnnotationDefinition);
if (findParticipantCohortAnnotation(cohortReviewId, participantCohortAnnotation.getCohortAnnotationDefinitionId(), participantCohortAnnotation.getParticipantId()) != null) {
throw new BadRequestException(String.format("Invalid Request: Cohort annotation definition exists for id: %s", participantCohortAnnotation.getCohortAnnotationDefinitionId()));
}
return participantCohortAnnotationDao.save(participantCohortAnnotation);
}
use of org.pmiops.workbench.exceptions.BadRequestException in project workbench by all-of-us.
the class CohortReviewServiceImplTest method saveParticipantCohortAnnotationBadRequestCohortAnnotationDefinitionExists.
@Test
public void saveParticipantCohortAnnotationBadRequestCohortAnnotationDefinitionExists() throws Exception {
long cohortAnnotationDefinitionId = 1;
long cohortReviewId = 1;
long participantId = 1;
ParticipantCohortAnnotation participantCohortAnnotation = new ParticipantCohortAnnotation().annotationValueBoolean(Boolean.TRUE).cohortAnnotationDefinitionId(cohortAnnotationDefinitionId).cohortReviewId(cohortReviewId).participantId(participantId);
CohortAnnotationDefinition cohortAnnotationDefinition = createCohortAnnotationDefinition(cohortAnnotationDefinitionId, AnnotationType.BOOLEAN);
when(cohortAnnotationDefinitionDao.findOne(cohortAnnotationDefinitionId)).thenReturn(cohortAnnotationDefinition);
when(participantCohortAnnotationDao.findByCohortReviewIdAndCohortAnnotationDefinitionIdAndParticipantId(cohortReviewId, cohortAnnotationDefinitionId, participantId)).thenReturn(participantCohortAnnotation);
try {
cohortReviewService.saveParticipantCohortAnnotation(cohortReviewId, participantCohortAnnotation);
fail("Should have thrown BadRequestException!");
} catch (BadRequestException e) {
assertEquals("Invalid Request: Cohort annotation definition exists for id: " + cohortAnnotationDefinitionId, e.getMessage());
}
verify(cohortAnnotationDefinitionDao).findOne(cohortAnnotationDefinitionId);
verifyNoMoreMockInteractions();
}
Aggregations