Skip to content

Dependent Queries

jhatcher9999 edited this page May 1, 2017 · 1 revision

Here is an example of a set of queries that gets initiated by a single request. The single request triggers three "bucketed" queries; then based on the results of the three queries, a fourth query is kicked off.

import com.datastax.driver.core.{PreparedStatement, ResultSet}
import core.BaseAction
import io.gatling.core.Predef._
import io.gatling.core.session.Expression
import io.gatling.core.structure.ChainBuilder
import io.github.gatling.dse.CqlPredef._
import libs.{Cassandra, SimConfig}


  def readCurrency1501_Q34 : ChainBuilder  = {

    val query_readCurrency1501_Q34_template =
      "SELECT idx_col1, idx_col2, idx_col3, idx_col4, idx_col5, idx_col6, xml_doc_id_nbr " +
        s"FROM " + keyspace + "." + table + " " +
        "WHERE idx_col1 = ? " +
        "AND idx_col2 = ? " +
        "AND idx_col3 = ? " +
        "AND idx_col4 = ? " +
        "AND idx_col5 = %d " +
        "AND idx_col6 <= ? " +
        "ORDER BY idx_col6 DESC " +
        "LIMIT 1;"
    val query_readCurrency1501_Q34_query1 = query_readCurrency1501_Q34_template.format(1)
    val query_readCurrency1501_Q34_query2 = query_readCurrency1501_Q34_template.format(2)
    val query_readCurrency1501_Q34_query3 = query_readCurrency1501_Q34_template.format(3)
    val preparedStatement_readCurrency1501_Q34_query1 = session.prepare(query_readCurrency1501_Q34_query1)
    val preparedStatement_readCurrency1501_Q34_query2 = session.prepare(query_readCurrency1501_Q34_query2)
    val preparedStatement_readCurrency1501_Q34_query3 = session.prepare(query_readCurrency1501_Q34_query3)

    //    SELECT idx_col1, idx_col2, idx_col3, idx_col4, idx_col5, idx_col6
    //    FROM domain_1500_level1.xml_idx_1501_11
    //    WHERE idx_col1 = 'COP'         //fromCurrency
    //    AND idx_col2 = 'CAD'           //toCurrency
    //    AND idx_col3 = 'GOV'           //sourceType
    //    AND idx_col4 = 'gov-currency'  //exchangeRateTypeCode
    //    AND idx_col5 = 1 -- or 2 or 3  //bucket
    //    AND idx_col6 <= '2017-04-13'   //effectiveDate
    //    ORDER BY idx_col6 DESC
    //    LIMIT 1;

    runThreeBucketQuery(
      query_readCurrency1501_Q34_query1,
      preparedStatement_readCurrency1501_Q34_query1,
      preparedStatement_readCurrency1501_Q34_query2,
      preparedStatement_readCurrency1501_Q34_query3,
      "${fromCurrency}",
      "${toCurrency}",
      "${sourceType}",
      "${exchangeRateTypeCode}",
      "${effectiveDate}"
    )

  private def runThreeBucketQuery
  (
    q1: String,
    ps1: PreparedStatement,
    ps2: PreparedStatement,
    ps3: PreparedStatement,
    paramsList: Expression[AnyRef]*
  ) =
  {

    logger.debug(q1)

    group(Groups.SELECT) {
      exec(
        //        exec( session => {
        //          for(a <- session.attributes){
        //            println(a)
        //          }
        //          session
        //        }),
        exec(
          cql(table + "_bucket1")
            .executePrepared(ps1)
            .withParams(paramsList: _*)
            .check(resultSet.saveAs("results1"))
        ),
        exec(
          cql(table + "_bucket2")
            .executePrepared(ps2)
            .withParams(paramsList: _*)
            .check(resultSet.saveAs("results2"))
        ),
        exec(
          cql(table + "_bucket3")
            .executePrepared(ps3)
            .withParams(paramsList: _*)
            .check(resultSet.saveAs("results3"))
        )
      )
        .exec(session => findFirstDocumentNumberInThreeQueries(session)).exitHereIfFailed
        .exec(
          cql("doc table lookup")
            .executePrepared(psDocTableQuery)
            .withParams("${firstDocNumber}")
            .check(rowCount greaterThanOrEqual 1)
        )
    }
  }

  private def findFirstDocumentNumberInThreeQueries(session : Session) : Session = {
    var doc1: Long = 0
    var doc2: Long = 0
    var doc3: Long = 0

    val results1 = if (session.contains("results1")){
      session("results1").as[ResultSet].one
    } else {
      null
    }
    if (results1 != null) {
      doc1 = results1.getLong("xml_doc_id_nbr")
    }

    val results2 = if (session.contains("results2")){
      session("results2").as[ResultSet].one
    } else {
      null
    }
    if (results2 != null) {
      doc2 = results2.getLong("xml_doc_id_nbr")
    }

    val results3 = if (session.contains("results3")){
      session("results3").as[ResultSet].one
    } else {
      null
    }
    if (results3 != null) {
      doc3 = results3.getLong("xml_doc_id_nbr")
    }

    val firstDocNumber = {
      if (doc1 > 0) {
        doc1
      } else if (doc2 > 0) {
        doc2
      } else if (doc3 > 0) {
        doc3
      } else {
        0
      }
    }

    //helpful article for understanding the Expression language in Gatling
    //  http://gatling.io/docs/current/session/expression_el/

    if (firstDocNumber == 0) {
      session.markAsFailed
    } else {
      session.set("firstDocNumber", firstDocNumber)
    }
  }