public static StormTopology buildTopology() {
   TridentTopology topology = new TridentTopology();
   DiagnosisEventSpout spout = new DiagnosisEventSpout();
   Stream inputStream = topology.newStream("event", spout);
   inputStream
       // Filter for critical events.
       .each(new Fields("event"), new DiseaseFilter())
       // Locate the closest city
       .each(new Fields("event"), new CityAssignment(), new Fields("city"))
       // Derive the hour segment
       .each(
           new Fields("event", "city"),
           new HourAssignment(),
           new Fields("hour", "cityDiseaseHour"))
       // Group occurrences in same city and hour
       .groupBy(new Fields("cityDiseaseHour"))
       // Count occurrences and persist the results.
       .persistentAggregate(new OutbreakTrendFactory(), new Count(), new Fields("count"))
       .newValuesStream()
       // Detect an outbreak
       .each(
           new Fields("cityDiseaseHour", "count"),
           new OutbreakDetector(),
           new Fields("alert")) // Dispatch the alert
       .each(new Fields("alert"), new DispatchAlert(), new Fields());
   return topology.build();
 }
  @Test
  public void testTridentTopology() throws Exception {

    Session session = cassandraCQLUnit.session;
    String[] stationIds = {"station-1", "station-2", "station-3"};
    for (int i = 1; i < 4; i++) {
      ResultSet resultSet =
          session.execute(
              "INSERT INTO weather.station(id, name) VALUES(?, ?)",
              stationIds[i - 1],
              "Foo-Station-" + new Random().nextInt());
    }

    ResultSet rows = cassandraCQLUnit.session.execute("SELECT * FROM weather.station");
    for (Row row : rows) {
      System.out.println("####### row = " + row);
    }

    WeatherBatchSpout weatherBatchSpout =
        new WeatherBatchSpout(
            new Fields("weather_station_id", "temperature", "event_time"), 3, stationIds);

    TridentTopology topology = new TridentTopology();
    Stream stream = topology.newStream("cassandra-trident-stream", weatherBatchSpout);

    CassandraStateFactory insertValuesStateFactory = getInsertTemperatureStateFactory();

    CassandraStateFactory selectWeatherStationStateFactory = getSelectWeatherStationStateFactory();

    TridentState selectState = topology.newStaticState(selectWeatherStationStateFactory);
    stream =
        stream.stateQuery(
            selectState,
            new Fields("weather_station_id"),
            new CassandraQuery(),
            new Fields("name"));
    stream = stream.each(new Fields("name"), new PrintFunction(), new Fields("name_x"));

    stream.partitionPersist(
        insertValuesStateFactory,
        new Fields("weather_station_id", "name", "event_time", "temperature"),
        new CassandraStateUpdater(),
        new Fields());

    StormTopology stormTopology = topology.build();
    LocalCluster cluster = new LocalCluster();
    cluster.submitTopology("wordCounter", getConfig(), stormTopology);
    Thread.sleep(30 * 1000);

    rows = cassandraCQLUnit.session.execute("SELECT * FROM weather.temperature");
    Assert.assertTrue(rows.iterator().hasNext()); // basic sanity check

    cluster.killTopology("wordCounter");
    cluster.shutdown();
  }
 @Override
 protected Stream createTracesStream(Stream stream) {
   return stream.each(
       new Fields("str"), new JsonToTrace(sessionId), new Fields("versionId", "trace"));
 }