blob: 1a7bfd8a404dd718cdc2fe7a1d075922f46e7cb5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.gatling.check
import io.gatling.commons.validation.SuccessWrapper
import io.gatling.core.check.Check
import io.gatling.core.check.CheckBuilder
import io.gatling.core.check.CheckMaterializer
import io.gatling.core.check.CountCriterionExtractor
import io.gatling.core.check.Extractor
import io.gatling.core.check.FindAllCriterionExtractor
import io.gatling.core.check.FindCriterionExtractor
import io.gatling.core.check.Preparer
import io.gatling.core.check.identityPreparer
import io.gatling.core.session.Expression
import io.gatling.core.session.ExpressionSuccessWrapper
/**
* DSL for checks performed against the SQL query result set. Exposed as a `resultSet` check type.
*
* The result set is represented as a list of rows. Each row is a list of Any.
*
* Standard gatling extraction methods are supported: find, findAll, findRandom and count.
*/
trait IgniteSqlCheckSupport extends IgniteCheckSupport {
/**
* SQL query result check type.
*/
trait SqlCheckType
/**
* Type of the SQL result set row.
*/
type Row = List[Any]
/**
* Type of the raw Ignite SQL query operation result.
*/
type RawSqlResult = List[Row]
/**
* Type of the prepared Ignite SQL query operation result.
*/
type PreparedSqlResult = RawSqlResult
/**
* Check of Ignite SQL query operation result.
*/
type SqlCheck = Check[RawSqlResult]
/**
* Implicit conversion from check builder to check itself.
*
* @param checkBuilder Check builder.
* @param materializer Materializer.
* @tparam T Check type.
* @tparam P Prepared result type.
* @return SqlCheck.
*/
implicit def checkBuilder2SqlCheck[T, P](checkBuilder: CheckBuilder[T, P])(implicit
materializer: CheckMaterializer[T, SqlCheck, RawSqlResult, P]
): SqlCheck =
checkBuilder.build(materializer)
/**
* Implicit conversion to use the `exists` by default for Validate.
*
* @param validate Validate instance.
* @param materializer Materializer.
* @tparam T Check type.
* @tparam P Type of the prepared result.
* @tparam X Type of the extracted result.
* @return SqlCheck.
*/
implicit def validate2SqlCheck[T, P, X](validate: CheckBuilder.Validate[T, P, X])(implicit
materializer: CheckMaterializer[T, SqlCheck, RawSqlResult, P]
): SqlCheck =
validate.exists
/**
* Implicit conversion to use the `find(0).exists` by default for Find.
*
* @param find Find.
* @param materializer Materializer.
* @tparam T Check type.
* @tparam P Type of the prepared result.
* @tparam X Type of the extracted result.
* @return SqlCheck.
*/
implicit def find2SqlCheck[T, P, X](find: CheckBuilder.Find[T, P, X])(implicit
materializer: CheckMaterializer[T, SqlCheck, RawSqlResult, P]
): SqlCheck =
find.find.exists
/**
* Implicit materializer for preparation of raw result as input for SQL check.
*/
implicit val SqlCheckMaterializer: CheckMaterializer[SqlCheckType, SqlCheck, RawSqlResult, PreparedSqlResult] =
new CheckMaterializer[SqlCheckType, SqlCheck, RawSqlResult, PreparedSqlResult](identity) {
override protected def preparer: Preparer[RawSqlResult, PreparedSqlResult] = identityPreparer
}
/**
* Builder for the SQL query result check exposed as a `resultSet` DSL function.
*
* @return SQL check builder
*/
def resultSet: CheckBuilder.MultipleFind.Default[SqlCheckType, PreparedSqlResult, Row] =
new CheckBuilder.MultipleFind.Default[SqlCheckType, PreparedSqlResult, Row](displayActualValue = true) {
override protected def findExtractor(occurrence: Int): Expression[Extractor[PreparedSqlResult, Row]] =
new FindCriterionExtractor[PreparedSqlResult, Int, Row](
"row",
occurrence,
occurrence,
p => p.drop(occurrence).headOption.success
).expressionSuccess
override protected def findAllExtractor: Expression[Extractor[PreparedSqlResult, Seq[Row]]] =
new FindAllCriterionExtractor[PreparedSqlResult, Int, Row](
"row",
0,
p => Some(p).success
).expressionSuccess
override protected def countExtractor: Expression[Extractor[PreparedSqlResult, Int]] =
new CountCriterionExtractor[PreparedSqlResult, Int](
"row",
0,
p => Some(p.size).success
).expressionSuccess
}
}