@Override public void serialize(Label label, JsonGenerator generator, SerializerProvider provider) throws IOException { generator.writeString(label.toString()); } }
public void setLabel(Bucket.Label label) { if (label != null && !isEmpty(label.toString())) this.label = label; else throw new IllegalArgumentException("The label of a bucket can not be empty"); }
@Override public void serialize(Label label, JsonGenerator generator, SerializerProvider provider) throws IOException { generator.writeString(label.toString()); } }
/** * This method finds the right attributes to set. The set fields can be found * in the {@link TextTemplates}. * * @param buckEvent an {@link BucketChangeEvent} that represents the changes * @return the message for the email */ private String getBucketChangedMessage(BucketChangeEvent buckEvent) { ST template = new ST(BUCKET_CHANGE); Map<String, String> variables = new HashMap<>(); Bucket buck = buckEvent.getBucket(); ExperimentBase exp = buckEvent.getExperiment(); put(variables, EXPERIMENT_LABEL, exp.getLabel()); put(variables, BUCKET_NAME, buck.getLabel().toString()); put(variables, APPLICATION_NAME, String.valueOf(exp.getApplicationName())); put(variables, USER_NAME, getUserRepresentation(buckEvent.getUser())); put(variables, FIELD_NAME, buckEvent.getPropertyName()); if (buckEvent.getPropertyName() != null && "allocation".equalsIgnoreCase(buckEvent.getPropertyName())) { put(variables, FIELD_BEFORE, String.valueOf(((double) Math.round(Double.parseDouble(buckEvent.getBefore()) * 10000d) / 10000d) * 100).concat("%")); put(variables, FIELD_AFTER, String.valueOf(((double) Math.round(Double.parseDouble(buckEvent.getAfter()) * 10000d) / 10000d) * 100).concat("%")); } else { put(variables, FIELD_BEFORE, buckEvent.getBefore()); put(variables, FIELD_AFTER, buckEvent.getAfter()); } return replaceVariablesInTemplate(variables, template); }
/** * Make entries in experiment_user_index table * * @param assignments */ private void indexExperimentsToUser(List<Pair<Experiment, Assignment>> assignments) { try { Session session = driver.getSession(); final BatchStatement batchStatement = new BatchStatement(BatchStatement.Type.UNLOGGED); assignments.forEach(pair -> { Assignment assignment = pair.getRight(); LOGGER.debug("assignment={}", assignment); BoundStatement bs; if (isNull(assignment.getBucketLabel())) { bs = experimentUserIndexAccessor.insertBoundStatement(assignment.getUserID().toString(), assignment.getContext().toString(), assignment.getApplicationName().toString(), assignment.getExperimentID().getRawID()); } else { bs = experimentUserIndexAccessor.insertBoundStatement(assignment.getUserID().toString(), assignment.getContext().toString(), assignment.getApplicationName().toString(), assignment.getExperimentID().getRawID(), assignment.getBucketLabel().toString()); } batchStatement.add(bs); }); session.execute(batchStatement); LOGGER.debug("Finished experiment_user_index"); } catch (Exception e) { LOGGER.error("Error occurred while adding data in to experiment_user_index", e); } }
/** * Convert Assignment object of single-assignment to the response MAP expected by the end user. * <p> * Single-assignment response map can contain: * - assignment * - payload * - status * - cache * - context * * @param assignment * @return response map */ protected Map<String, Object> toSingleAssignmentResponseMap(final Assignment assignment) { Map<String, Object> response = newHashMap(); // Only include `assignment` property if there is a definitive assignment, either to a bucket or not if (assignment.getStatus().isDefinitiveAssignment()) { response.put("assignment", nonNull(assignment.getBucketLabel()) ? assignment.getBucketLabel().toString() : null); if (nonNull(assignment.getBucketLabel())) { response.put("payload", assignment.getPayload()); } } response.put("status", assignment.getStatus()); response.put("cache", assignment.getStatus().isDefinitiveAssignment()); if (assignment.getContext() != null) { response.put("context", assignment.getContext().toString()); } return response; }
@Override public void createBucket(Bucket newBucket) throws RepositoryException { final String SQL = "insert into bucket (" + "experiment_id, description, label, allocation_percent, is_control, payload, state) " + "values (?,?,?,?,?,?,?)"; try { newTransaction().insert( SQL, newBucket.getExperimentID(), newBucket.getDescription() != null ? newBucket.getDescription() : "", newBucket.getLabel().toString(), newBucket.getAllocationPercent(), newBucket.isControl() != null ? newBucket.isControl() : false, newBucket.getPayload() != null ? newBucket.getPayload() : "", Bucket.State.OPEN.toString()); } catch (WasabiException e) { throw e; } catch (Exception e) { throw new RepositoryException("Could not create bucket \"" + newBucket + "\"", e); } }
@Override public void assignUserToExports(Assignment assignment, Date date) { final DateHour dateHour = new DateHour(); dateHour.setDateHour(date); //TODO: why is this not derived from assignment.getCreated() instead? final Date day_hour = dateHour.getDayHour(); try { if (isNull(assignment.getBucketLabel())) { userAssignmentExportAccessor.insertBy(assignment.getExperimentID().getRawID(), assignment.getUserID().toString(), assignment.getContext().getContext(), date, day_hour, "NO_ASSIGNMENT", true); } else { userAssignmentExportAccessor.insertBy(assignment.getExperimentID().getRawID(), assignment.getUserID().toString(), assignment.getContext().getContext(), date, day_hour, assignment.getBucketLabel().toString(), false); } } catch (WriteTimeoutException | UnavailableException | NoHostAvailableException e) { throw new RepositoryException("Could not save user assignment in user_assignment_export \"" + assignment + "\"", e); } }
/** * {@inheritDoc} */ @Override public Bucket getBucket(Experiment.ID experimentID, Bucket.Label bucketLabel) { Preconditions.checkNotNull(experimentID, "Parameter \"experimentID\" cannot be null"); Preconditions.checkNotNull(bucketLabel, "Parameter \"bucketLabel\" cannot be null"); try { List<com.intuit.wasabi.repository.cassandra.pojo.Bucket> bucket = bucketAccessor.getBucketByExperimentIdAndBucket( experimentID.getRawID(), bucketLabel.toString()).all(); if (bucket.size() == 0) return null; if (bucket.size() > 1) throw new RepositoryException("More than one row found for experiment ID " + experimentID + " and label " + bucketLabel); Bucket result = BucketHelper.makeBucket(bucket.get(0)); return result; } catch (Exception e) { throw new RepositoryException("Could not retrieve bucket \"" + bucketLabel + "\" in experiment \"" + experimentID + "\" because " + e, e); } }
/** * {@inheritDoc} */ @Override public void createBucket(Bucket newBucket) { LOGGER.debug("Creating bucket {}", newBucket); Preconditions.checkNotNull(newBucket, "Parameter \"newBucket\" cannot be null"); final Bucket.State STATE = Bucket.State.OPEN; try { bucketAccessor.insert(newBucket.getExperimentID().getRawID(), newBucket.getLabel().toString(), newBucket.getDescription(), newBucket.getAllocationPercent(), newBucket.isControl(), newBucket.getPayload(), STATE.name()); } catch (Exception e) { LOGGER.error("Error creating bucket {}", newBucket, e); throw new RepositoryException("Could not create bucket \"" + newBucket + "\" because " + e, e); } }
void indexExperimentsToUser(Assignment assignment) { try { if (isNull(assignment.getBucketLabel())) { experimentUserIndexAccessor.insertBy( assignment.getUserID().toString(), assignment.getContext().getContext(), assignment.getApplicationName().toString(), assignment.getExperimentID().getRawID() ); } else { experimentUserIndexAccessor.insertBy( assignment.getUserID().toString(), assignment.getContext().getContext(), assignment.getApplicationName().toString(), assignment.getExperimentID().getRawID(), assignment.getBucketLabel().toString() ); } } catch (WriteTimeoutException | UnavailableException | NoHostAvailableException e) { throw new RepositoryException("Could not index experiment to user \"" + assignment + "\"", e); } }
/** * {@inheritDoc} */ @Override public Bucket updateBucketState(Bucket bucket, Bucket.State desiredState) { LOGGER.debug("Updating bucket {} state {}", new Object[]{bucket, desiredState}); try { bucketAccessor.updateState(desiredState.name(), bucket .getExperimentID().getRawID(), bucket.getLabel().toString()); Result<com.intuit.wasabi.repository.cassandra.pojo.Bucket> bucketPojo = bucketAccessor.getBucketByExperimentIdAndBucket(bucket.getExperimentID() .getRawID(), bucket.getLabel().toString()); return BucketHelper.makeBucket(bucketPojo.one()); } catch (Exception e) { LOGGER.error("Error while updating bucket {} state {}", new Object[]{bucket, desiredState}, e); throw new RepositoryException("Exception while updating bucket state " + bucket + " state " + desiredState, e); } }
/** * @param bucket bucket to update * @param desiredAllocationPercentage allocation information * @return bucket that were passed in???? * @throws RepositoryException */ @Override public Bucket updateBucketAllocationPercentage(Bucket bucket, Double desiredAllocationPercentage) throws RepositoryException { final String SQL = "update bucket " + "set allocation_percent=? " + "where experiment_id=? and label=?"; newTransaction().update( SQL, desiredAllocationPercentage.toString(), bucket.getExperimentID(), bucket.getLabel().toString()); return bucket; }
/** * {@inheritDoc} */ @Override public void logBucketChanges(Experiment.ID experimentID, Bucket.Label bucketLabel, List<BucketAuditInfo> changeList) { final Date NOW = new Date(); try { for (BucketAuditInfo changeData : changeList) { bucketAuditLogAccessor.insertBy(experimentID.getRawID(), bucketLabel.toString(), NOW, changeData.getAttributeName(), (changeData.getOldValue() != null) ? changeData.getOldValue() : "", (changeData.getNewValue() != null) ? changeData.getNewValue() : ""); } } catch (Exception e) { throw new RepositoryException("Could not log bucket changes \"" + experimentID + " : " + bucketLabel + " " + "\"", e); } }
/** * This method finds the right attributes to set. The set fields can be found * in the {@link TextTemplates}. * * @param buckEvent an {@link BucketCreateEvent} that represents the changes * @return the message for the email */ private String getBucketCreatedMessage(BucketCreateEvent buckEvent) { ST template = new ST(BUCKET_CREATED); Map<String, String> variables = new HashMap<>(); Bucket buck = buckEvent.getBucket(); ExperimentBase exp = buckEvent.getExperiment(); put(variables, EXPERIMENT_LABEL, exp.getLabel()); put(variables, BUCKET_NAME, buck.getLabel().toString()); put(variables, APPLICATION_NAME, String.valueOf(exp.getApplicationName())); put(variables, USER_NAME, getUserRepresentation(buckEvent.getUser())); return replaceVariablesInTemplate(variables, template); }
/** * {@inheritDoc} */ @Override public Bucket updateBucketAllocationPercentage(Bucket bucket, Double desiredAllocationPercentage) { try { bucketAccessor.updateAllocation(desiredAllocationPercentage, bucket.getExperimentID().getRawID(), bucket.getLabel().toString()); } catch (Exception e) { throw new RepositoryException("Could not update bucket allocation percentage \"" + bucket.getExperimentID() + "\".\"" + bucket.getLabel() + "\"", e); } // return the bucket with the updated values bucket = getBucket(bucket.getExperimentID(), bucket.getLabel()); return bucket; }
@Override public void updateBucketAssignmentCount(Experiment experiment, Assignment assignment, boolean countUp) { Optional<Bucket.Label> labelOptional = Optional.ofNullable(assignment.getBucketLabel()); try { if (countUp) { bucketAssignmentCountAccessor.incrementCountBy(experiment.getID().getRawID(), labelOptional.orElseGet(() -> NULL_LABEL).toString() ); } else { bucketAssignmentCountAccessor.decrementCountBy(experiment.getID().getRawID(), labelOptional.orElseGet(() -> NULL_LABEL).toString() ); } } catch (WriteTimeoutException | UnavailableException | NoHostAvailableException e) { throw new RepositoryException("Could not update the bucket count for experiment " + experiment.getID() + " bucket " + labelOptional.orElseGet(() -> NULL_LABEL).toString(), e); } }
@Override public Bucket updateBucketState(Bucket bucket, Bucket.State desiredState) throws RepositoryException { final String SQL = "update bucket " + "set state = ? " + "where experiment_id=? and label=?"; newTransaction().update( SQL, desiredState.toString(), bucket.getExperimentID(), bucket.getLabel().toString()); return bucket; }
/** * {@inheritDoc} */ @Override public void deleteBucket(Experiment.ID experimentID, Bucket.Label bucketLabel) { Preconditions.checkNotNull(experimentID, "Parameter \"experimentID\" cannot be null"); Preconditions.checkNotNull(bucketLabel, "Parameter \"bucketLabel\" cannot be null"); try { bucketAccessor.deleteByExperimentIdAndLabel(experimentID.getRawID(), bucketLabel.toString()); } catch (Exception e) { throw new RepositoryException("Could not delete bucket \"" + bucketLabel + "\" from experiment with ID \"" + experimentID + "\"", e); } }
@Override public Argument build(Class<?> expectedType, Bucket.Label value, StatementContext context) { return new StringArgument(value.toString()); } }