@Override public void serialize(Name name, JsonGenerator generator, SerializerProvider provider) throws IOException { generator.writeString(name.toString()); } }
@Override public Name deserialize(JsonParser parser, DeserializationContext context) throws IOException { return Name.valueOf(parser.getText()); } }
Map<Pair<Application.Name, Page.Name>, ListenableFuture<Result<PageExperimentByAppNamePage>>> expFutureMap = new HashMap<>(); appAndPagePairs.forEach(pair -> { expFutureMap.put(pair, pageExperimentIndexAccessor.asyncSelectBy(pair.getLeft().toString(), pair.getRight().toString())); });
@Override public List<PageExperiment> getExperiments(Application.Name applicationName, Page.Name pageName) { Stream<PageExperimentByAppNamePage> resultList = Stream.empty(); try { Result<PageExperimentByAppNamePage> result = pageExperimentIndexAccessor.selectBy(applicationName.toString(), pageName.toString()); resultList = StreamSupport.stream( Spliterators.spliteratorUnknownSize(result.iterator(), Spliterator.ORDERED), false); } catch (ReadTimeoutException | UnavailableException | NoHostAvailableException e) { throw new RepositoryException(new StringBuilder("Could not retrieve the experiments for applicationName:\"").append(applicationName).append("\", page:\"").append(pageName).append("\"").toString(), e); } //TODO: make the experiment label part of the pageExperimentIndex to save a query per page return resultList .map(t -> { Optional<com.intuit.wasabi.repository.cassandra.pojo.Experiment> experiment = Optional.ofNullable(experimentAccessor.selectBy(t.getExperimentId()).one()); PageExperiment.Builder builder = new PageExperiment.Builder( Experiment.ID.valueOf(t.getExperimentId()), null, t.isAssign() ); if (experiment.isPresent()) { builder.setLabel(Experiment.Label.valueOf(experiment.get().getLabel())); } return builder.build(); } ).filter(t -> t.getLabel() != null) .collect(Collectors.toList()); }
@Override public void postPages(Application.Name applicationName, Experiment.ID experimentID, ExperimentPageList experimentPageList) throws RepositoryException { ExperimentPageList oldPageList = getExperimentPages(experimentID); BatchStatement batch = new BatchStatement(); for (ExperimentPage experimentPage : experimentPageList.getPages()) { batch.add(pageExperimentIndexAccessor.insertBy( applicationName.toString(), experimentPage.getName().toString(), experimentID.getRawID(), experimentPage.getAllowNewAssignment() )); batch.add(experimentPageAccessor.insertBy( experimentPage.getName().toString(), experimentID.getRawID(), experimentPage.getAllowNewAssignment() )); batch.add(appPageIndexAccessor.insertBy( applicationName.toString(), experimentPage.getName().toString() )); } executeBatchStatement(experimentID, batch); ExperimentPageList newPageList = getExperimentPages(experimentID); saveExperimentPageState(experimentID, oldPageList, newPageList); }
/** * {@inheritDoc} */ @Override public void postPages(Experiment.ID experimentID, ExperimentPageList experimentPageList, UserInfo user) { Application.Name applicationName = getApplicationNameForModifyingPages(experimentID); pagesRepository.postPages(applicationName, experimentID, experimentPageList); Experiment experiment = experiments.getExperiment(experimentID); if (experiment != null) { List<String> pageNames = new ArrayList<>(); for (ExperimentPage experimentPage : experimentPageList.getPages()) { pageNames.add(experimentPage.getName().toString()); } String pageString = StringUtils.join(pageNames, ", "); eventLog.postEvent(new ExperimentChangeEvent(user, experiment, "pages", null, pageString)); LOGGER.info("event=EXPERIMENT_METADATA_CHANGE, message=PAGES_ADDED, applicationName={}, experimentName={}, configuration=[pages={}]", experiment.getApplicationName(), experiment.getLabel(), pageString); } }
@Override public List<PageExperiment> getExperimentsWithoutLabels(Application.Name applicationName, Page.Name pageName) { Stream<PageExperimentByAppNamePage> resultList = Stream.empty(); try { Result<PageExperimentByAppNamePage> result = pageExperimentIndexAccessor.selectBy(applicationName.toString(), pageName.toString()); resultList = StreamSupport.stream(Spliterators.spliteratorUnknownSize(result.iterator(), Spliterator.ORDERED), false); } catch (ReadTimeoutException | UnavailableException | NoHostAvailableException e) { throw new RepositoryException("Could not retrieve the experiments for applicationName:\"" + applicationName + "\", page:\"" + pageName, e); } return resultList.map(t -> { PageExperiment.Builder builder = new PageExperiment.Builder( Experiment.ID.valueOf(t.getExperimentId()), null, t.isAssign() ); return builder.build(); } ).collect(Collectors.toList()); }
/** * {@inheritDoc} */ @Override public ExperimentList getPageExperiments(Application.Name applicationName, Page.Name pageName) { ExperimentList result = new ExperimentList(); if (applicationName == null || applicationName.toString().isEmpty() || pageName == null || pageName.toString().isEmpty()) { return result; } else { List<PageExperiment> pageExperiments = pagesRepository.getExperiments(applicationName, pageName); List<Experiment.ID> expIDList = new ArrayList<>(); if (!pageExperiments.isEmpty()) { for (PageExperiment pageExperiment : pageExperiments) { Experiment.ID experimentID = pageExperiment.getId(); expIDList.add(experimentID); } } result = cassandraRepository.getExperiments(expIDList); } return result; }
@Override public void deletePage(Application.Name applicationName, Experiment.ID experimentID, Page.Name pageName) { // For experiment audit log saving the current state of the experiment's page list ExperimentPageList oldPageList = getExperimentPages(experimentID); BatchStatement batch = new BatchStatement(); batch.add(pageExperimentIndexAccessor.deleteBy( applicationName.toString(), pageName.toString(), experimentID.getRawID() )); batch.add(experimentPageAccessor.deleteBy(pageName.toString(), experimentID.getRawID())); //TODO: original code does not have this // batch.add(appPageIndexAccessor.deleteBy(pageName.toString(), applicationName.toString())); executeBatchStatement(experimentID, batch); // For experiment audit log saving the current state of the experiment's page list that has been updated ExperimentPageList newPageList = getExperimentPages(experimentID); saveExperimentPageState(experimentID, oldPageList, newPageList); }
@Override public ExperimentPageList getExperimentPages(Experiment.ID experimentID) { ExperimentPageList experimentPageList = new ExperimentPageList(); try { Result<PageExperimentByAppNamePage> result = experimentPageAccessor.selectBy(experimentID.getRawID()); Stream<PageExperimentByAppNamePage> resultList = StreamSupport.stream( Spliterators.spliteratorUnknownSize(result.iterator(), Spliterator.ORDERED), false); List<ExperimentPage> experimentPages = resultList .map(t -> ExperimentPage.withAttributes( Page.Name.valueOf(t.getPage()), t.isAssign() ).build() ).collect(Collectors.toList()); experimentPageList.setPages(experimentPages); } catch (ReadTimeoutException | UnavailableException | NoHostAvailableException e) { throw new RepositoryException("Could not retrieve the pages for experiment: \"" + experimentID + "\"", e); } return experimentPageList; }
/** * {@inheritDoc} */ @Override public void deletePage(Experiment.ID experimentID, Page.Name pageName, UserInfo user) { Application.Name applicationName = getApplicationNameForModifyingPages(experimentID); pagesRepository.deletePage(applicationName, experimentID, pageName); Experiment experiment = experiments.getExperiment(experimentID); if (experiment != null) { eventLog.postEvent(new ExperimentChangeEvent(user, experiment, "pages", pageName.toString(), null)); } LOGGER.info("event=EXPERIMENT_METADATA_CHANGE, message=PAGE_REMOVED, applicationName={}, experimentName={}, configuration=[pageName={}, userName={}]", experiment.getApplicationName(), experiment.getLabel(), pageName, user.getUsername()); }
public static Name valueOf(String value) { return new Name(value); }
@Override public Name deserialize(JsonParser parser, DeserializationContext context) throws IOException { return Name.valueOf(parser.getText()); } }
@Override public List<Page> getPageList(Application.Name applicationName) { Stream<AppPage> resultList = getAppPagesFromCassandra(applicationName); return resultList .map(t -> new Page.Builder().withName(Page.Name.valueOf(t.getPage())).build()) .collect(Collectors.toList()); }
@Override public void serialize(Name name, JsonGenerator generator, SerializerProvider provider) throws IOException { generator.writeString(name.toString()); } }
@Override public Map<Page.Name, List<PageExperiment>> getPageExperimentList(Application.Name applicationName) { Stream<AppPage> resultList = getAppPagesFromCassandra(applicationName); ImmutableMap.Builder<Page.Name, List<PageExperiment>> result = ImmutableMap.builder(); resultList.forEach(t -> { Page page = new Page.Builder().withName(Page.Name.valueOf(t.getPage())).build(); //TODO: DB change to reduce this call per page, this call may return pageexperiment not owned by the current user List<PageExperiment> pageExperiments = getExperiments(applicationName, page.getName()); result.put(page.getName(), pageExperiments); }); return result.build(); }
public static Name valueOf(String value) { return new Name(value); }