-
Notifications
You must be signed in to change notification settings - Fork 9
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)
}
}
Getting Started
Feeds
Fetching Base Data
Load Generators
Simulations
- CQL Executors
- Simulation Writing Shortcuts
- Using Custom ClusterBuilder Settings
- Using Client to Node SSL
Advanced Topics
- Dependent Queries
- Using Graphite and Grafana
- Debugging Simulations
- Adjusting input from Feed Before Executing a Query
Archived (v1.0) Topics