Skip to content

Commit

Permalink
Merge pull request #1177 from partiql/coverage-rebase
Browse files Browse the repository at this point in the history
Initializes PartiQL's Code Coverage library
  • Loading branch information
johnedquinn authored Aug 29, 2023
2 parents 674e140 + 7bfb4eb commit 48cfc76
Show file tree
Hide file tree
Showing 48 changed files with 3,601 additions and 64 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ Thank you to all who have contributed!
disjunction `|`, conjunction `&`, negation `!`, and grouping.
- Adds default `equals` and `hashCode` methods for each generated abstract class of Sprout. This affects the generated
classes in `:partiql-ast` and `:partiql-plan`.
- Initializes PartiQL's Code Coverage library
- Adds support for BRANCH and BRANCH-CONDITION Coverage
- Adds integration with JUnit5 for ease-of-use
- For more information, see the "Writing PartiQL Unit Tests" article in our GitHub Wiki.
- Adds new constructor parameters to all variants of `PartiQLResult`.
- Adds two new methods to `PartiQLResult`: `getCoverageData` and `getCoverageStructure`.

### Changed
- **Breaking**: all product types defined by the internal Sprout tool no longer generate interfaces. They are now abstract
Expand Down Expand Up @@ -100,6 +106,7 @@ Thank you to all who have contributed!
- @howero
- @yuxtang-amazon
- @yliuuuu
- @johqunn
- @<your-username>

## [0.12.0] - 2023-06-14
Expand Down
7 changes: 6 additions & 1 deletion buildSrc/src/main/kotlin/partiql.versions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ object Versions {
const val ionJava = "1.10.2"
const val ionSchema = "1.2.1"
const val jansi = "2.4.0"
const val jgenhtml = "1.6"
const val jline = "3.21.0"
const val jmh = "0.5.3"
const val joda = "2.12.1"
Expand All @@ -47,7 +48,8 @@ object Versions {
// Testing
const val assertj = "3.11.0"
const val jacoco = "0.8.8"
const val junit5 = "5.7.0"
const val junit5 = "5.9.3"
const val junit5PlatformLauncher = "1.9.3"
const val junit4 = "4.12"
const val junit4Params = "1.1.1"
const val mockito = "4.5.0"
Expand All @@ -73,6 +75,7 @@ object Deps {
const val ionElement = "com.amazon.ion:ion-element:${Versions.ionElement}"
const val ionSchema = "com.amazon.ion:ion-schema-kotlin:${Versions.ionSchema}"
const val jansi = "org.fusesource.jansi:jansi:${Versions.jansi}"
const val jgenhtml = "com.googlecode.jgenhtml:jgenhtml:${Versions.jgenhtml}"
const val jline = "org.jline:jline:${Versions.jline}"
const val joda = "joda-time:joda-time:${Versions.joda}"
const val kasechange = "net.pearx.kasechange:kasechange:${Versions.kasechange}"
Expand All @@ -86,7 +89,9 @@ object Deps {
const val assertj = "org.assertj:assertj-core:${Versions.assertj}"
const val junit4 = "junit:junit:${Versions.junit4}"
const val junit4Params = "pl.pragmatists:JUnitParams:${Versions.junit4Params}"
const val junitApi = "org.junit.jupiter:junit-jupiter-api:${Versions.junit5}"
const val junitParams = "org.junit.jupiter:junit-jupiter-params:${Versions.junit5}"
const val junitPlatformLauncher = "org.junit.platform:junit-platform-launcher:${Versions.junit5PlatformLauncher}"
const val junitVintage = "org.junit.vintage:junit-vintage-engine:${Versions.junit5}"
const val kotlinTest = "org.jetbrains.kotlin:kotlin-test:${Versions.kotlin}"
const val kotlinTestJunit = "org.jetbrains.kotlin:kotlin-test-junit5:${Versions.kotlin}"
Expand Down
11 changes: 7 additions & 4 deletions docs/wiki/_Sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,6 @@
* [Cookbook](https://github.com/partiql/partiql-lang-kotlin/wiki/Cookbook)
* [Manipulating the AST](https://github.com/partiql/partiql-lang-kotlin/wiki/Manipulating-the-AST)
* [Use Experimental Features](https://github.com/partiql/partiql-lang-kotlin/wiki/ExperimentalFeatures)
* Design & Development Documents
* [Abstract Syntax Tree](https://github.com/partiql/partiql-lang-kotlin/wiki/Abstract-Syntax-Tree)
* [Architecture Design](https://github.com/partiql/partiql-lang-kotlin/wiki/Architecture-Design)
* [Code Style Guidelines](https://github.com/partiql/partiql-lang-kotlin/wiki/CODE-STYLE)
* Documentation
* [Exceptions](https://github.com/partiql/partiql-lang-kotlin/wiki/Exceptions)
* [Functions](https://github.com/partiql/partiql-lang-kotlin/wiki/Functions)
Expand All @@ -21,6 +17,8 @@
* [Further Reading](https://github.com/partiql/partiql-lang-kotlin/wiki/Further-Reading)
* Clauses
* [EXPLAIN](https://github.com/partiql/partiql-lang-kotlin/wiki/Explain)
* Testing
* [Writing PartiQL Unit Tests](https://github.com/partiql/partiql-lang-kotlin/wiki/PartiQL-Code-Coverage)
* Serde
* [PartiQL Value <> ION](https://github.com/partiql/partiql-lang-kotlin/wiki/Serde)
* Upgrade Guides
Expand All @@ -35,3 +33,8 @@
* [v0.7 -> v0.8](https://github.com/partiql/partiql-lang-kotlin/wiki/v0.7-to-v0.8-upgrade)
* [v0.8 -> v0.9](https://github.com/partiql/partiql-lang-kotlin/wiki/v0.8-to-v0.9-upgrade)
* [Rewriter to Visitor Transform Guide](https://github.com/partiql/partiql-lang-kotlin/wiki/Rewriter-to-Visitor-Transform-Guide)
---
* Design & Development Documents
* [Abstract Syntax Tree](https://github.com/partiql/partiql-lang-kotlin/wiki/Abstract-Syntax-Tree)
* [Architecture Design](https://github.com/partiql/partiql-lang-kotlin/wiki/Architecture-Design)
* [Code Style Guidelines](https://github.com/partiql/partiql-lang-kotlin/wiki/CODE-STYLE)
63 changes: 63 additions & 0 deletions docs/wiki/documentation/PartiQL Code Coverage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# PartiQL Code Coverage

PartiQL has released a way for you to write unit tests and gather code coverage statistics for your PartiQL source
under `org.partiql.coverage`!

## Writing Tests

In order to write tests, you'll need to use `@PartiQLTest` in combination with `PartiQLTestProvider` and `PartiQLTestCase`. Here's
an example:

```kotlin
/**
* Here's an example of a test method. This method will get loaded up by JUnit 5's
* test framework and be executed.
*
* Note that each test method annotated with @PartiQLTest needs to take in an implementation of a PartiQLTestCase and a PartiQLResult.
* Note that PartiQLResult is a sealed interface -- you can opt to assume the variant that will be returned, or you can
* just take in a PartiQLResult.
*/
@PartiQLTest(provider = SimpleTestProvider::class)
fun simpleTest(tc: SimpleTestCase, result: PartiQLResult.Value) {
val exprValue = result.value
assertEquals(ExprValueType.BOOL, exprValue.type)
assertEquals(tc.expected, exprValue.booleanValue())
}

/**
* PartiQLTestProviders represent a set of tests aimed at testing a single query.
*/
class SimpleTestProvider : PartiQLTestProvider {
override val statement: String = "EXISTS(SELECT * FROM << x >> AS t WHERE t < 7)"
override fun getTestCases(): List<PartiQLTestCase> = listOf(
SimpleTestCase(x = 6, expected = true),
SimpleTestCase(x = 8, expected = false)
)
}

/**
* An implementation of a PartiQLTestCase. Note that we pass in
*/
class SimpleTestCase(private val x: Int, val expected: Boolean) : PartiQLTestCase {
override val session: EvaluationSession = EvaluationSession.builder {
globals(mapOf("x" to x))
}
}
```

Note that, similar to how it is written above, all test methods using `@PartiQLTest` need two parameters (the first being
an implementation of `PartiQLTestCase` and the second being `PartiQLResult` or one of its variants).

## JUnit Integration

`@PartiQL` integrates seamlessly with JUnit 5, and therefore, you can run tests directly from your IDE and use other JUnit 5
annotations such as `@Ignore`, `@Disabled`, `@Timeout`, and more,

## Other Features

PartiQL Code Coverage allows you to generate LCOV reports for branch and branch-condition coverage, generate HTML reports,
and fail builds on configured thresholds.

## Getting Started

To learn more, please refer to [PartiQL Code Coverage's README](https://github.com/partiql/partiql-lang-kotlin/tree/main/partiql-coverage)!
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
201 changes: 201 additions & 0 deletions partiql-coverage/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
# PartiQL Code Coverage

PartiQL's Code Coverage library stands as a mechanism for risk mitigation by ensuring that your PartiQL source is
thoroughly tested before deploying to your production environment.

## What is Code Coverage?

Code coverage is a metric to help you understand how much of your source is tested. There are several types of Code
Coverage including **Branch Coverage** and **Branch-Condition** Coverage.

### Branch Coverage

**Branch Coverage** is a metric calculated by determining how many *branches* are in a particular PartiQL query and
how many of those branches were executed. A branch is the result of a control-flow expression, such as an `IF` statement
in many programming languages (which results in two branches -- `true` and `false`).

Consider the following PartiQL statement:
```partiql
SELECT *
FROM t
WHERE
t.a > t.b
AND
t.b > t.c
```
In the above PartiQL statement, there is 1 demonstrated type of control flow (the `WHERE` clause). Given that each
control-flow expression can lead to two branches, this PartiQL statement contains 2 branches.

**Note**: There are other expressions that dictate control flow, such as `CASE-WHEN`, `HAVING`, `COALESCE`, and `NULLIF`. PartiQL
currently supports `WHERE`, `HAVING`, and `CASE-WHEN` (`COALESCE` and `NULLIF` are not supported, however, they may be
supported in future versions).

Here's a slightly more complicated example:

```partiql
SELECT
measurement AS measurement,
CASE (measurement > 0)
WHEN true THEN 'measurement is positive!'
WHEN false THEN 'measurement is negative!'
END AS measurementDescription,
CASE
WHEN (complexity < 0) THEN 'complexity is negative!'
WHEN (complexity = 0) THEN 'complexity is zero!'
WHEN (complexity > 0) THEN 'complexity is positive!'
END AS complexityDescription
FROM
t AS t
WHERE
t.radius > 0
GROUP BY
t.measurement AS measurement,
t.complexity AS complexity
HAVING
measurement != 0;
```

In the above example, there are 14 branches.

## Branch-Condition Coverage

**Branch-Condition Coverage** is a metric calculated by determining how many *branch-conditions* are in a particular PartiQL statement and
how many of those branch-conditions were executed. A branch-condition is the result of a boolean expression contained
within a control-flow expression, such as an `IF` statement in many programming languages. Consider the following example:
```partiql
SELECT *
FROM t
WHERE
t.a > t.b
AND
t.b < t.c
```

In the above PartiQL statement, there is one control-flow expression (the `WHERE` clause). The control-flow expression
results in two branches, however, there are 3 expressions dictating the result of the `WHERE` clause, specifically: the
greater-than expression, the `AND` expression, and the less-than expression. Now, depending on what typing mode you are using,
each one of these expressions can result in 3 or 4 outcomes (`TRUE`, `FALSE`, `NULL`, or `MISSING`).
- If you are in `PERMISSIVE` mode, each of these expressions could potentially return `TRUE`, `FALSE`, `NULL`, or `MISSING`. In
the above example, this would result in 12 branch-conditions.
- If you are not in `PERMISSIVE` mode, each of these expressions could potentially return `TRUE`, `FALSE`, or `MISSING`. In
the above example, this would result in 9 branch-conditions.

## Things to Note

1. While PartiQL’s current evaluator does not statically resolve the types of expressions, it is unknown whether a
specific branch-condition might return TRUE, FALSE, NULL, or MISSING. Therefore, the existing Evaluating Compiler will,
based on the typing mode, assume that all boolean expressions can return ALL possible outcomes. In the future, when
constant-folding and static-typing are part of the planning process, this will be mitigated.
2. Similar to #1, as the current evaluate does not statically resolve the types of expressions, functions and variable
references will not be part of a Branch-Condition Coverage result. However, in the future, support for this will be added.
3. As there is not a consensus regarding how `COALESCE` and `NULLIF` will be represented in the future evaluator,
these two SQL-defined functions currently do not create branches. However, this is subject to change in future releases.
- **Additional note**: While `COALESCE` and `NULLIF` are not supported for branch creation, the following clauses are supported:
`WHERE`, `HAVING`, and `CASE-WHEN`.

## Requirements

- Must be using JUnit5.

## Build Configuration

### JUnit5 Configuration

Please follow the directions outlined in [JUnit5's User Guide](https://junit.org/junit5/docs/current/user-guide/).

### Adding Dependencies

```kotlin
// File: build.gradle.kts
const val LATEST_VERSION = "0.13.0" // Please search Maven Central for latest version
dependencies {
testImplementation("org.partiql:partiql-coverage:$LATEST_VERSION")
}
```

### Adding Coverage Thresholds

The PartiQL Code Coverage library allows consumers to fail their local builds if they haven't reached
a minimum branch coverage. See below:
```kotlin
// File: build.gradle.kts
tasks.test {
// Branch Configurations
systemProperty("partiql.coverage.lcov.branch.enabled", true)
systemProperty("partiql.coverage.lcov.branch.report.path", "$buildDir/partiql/coverage/branch/lcov.info")
systemProperty("partiql.coverage.lcov.branch.html.dir", "$buildDir/reports/partiql/branch/test")
systemProperty("partiql.coverage.lcov.branch.threshold.min", 0.75)

// Branch Condition Configurations
systemProperty("partiql.coverage.lcov.branch-condition.enabled", true)
systemProperty("partiql.coverage.lcov.branch-condition.report.path", "$buildDir/partiql/coverage/condition/lcov.info")
systemProperty("partiql.coverage.lcov.branch-condition.html.dir", "$buildDir/reports/partiql/condition/test")
systemProperty("partiql.coverage.lcov.branch-condition.threshold.min", 0.75)
}
```

### All System Properties
| Key | Value Type | Description | Example Value |
| --- | ---------- | ----------- | ------------- |
| partiql.coverage.lcov.branch.enabled | BOOLEAN | Specifies that LCOV reporting should be enabled | true |
| partiql.coverage.lcov.branch.report.path | STRING | Required if LCOV is enabled. Specifies where to place the LCOV report. | build/partiql/coverage/branch/lcov.info |
| partiql.coverage.lcov.branch.html.dir | STRING | Specifies where to output the JGenHTML output. | build/reports/partiql/branch/test |
| partiql.coverage.lcov.branch.threshold.min | DECIMAL | Specifies the minimum percentage (in decimal form) for branch coverage. Builds will fail when the threshold is not met. | 0.75 |

| Key | Value Type | Description | Example Value |
| --- | ---------- | ----------- | ------------- |
| partiql.coverage.lcov.branch-condition.enabled | BOOLEAN | Specifies that LCOV reporting should be enabled | true |
| partiql.coverage.lcov.branch-condition.report.path | STRING | Required if LCOV is enabled. Specifies where to place the LCOV report. | build/partiql/coverage/branch/lcov.info |
| partiql.coverage.lcov.branch-condition.html.dir | STRING | Specifies where to output the JGenHTML output. | build/reports/partiql/branch/test |
| partiql.coverage.lcov.branch-condition.threshold.min | DECIMAL | Specifies the minimum percentage (in decimal form) for branch coverage. Builds will fail when the threshold is not met. | 0.75 |

## API Usage

Now, we can actually begin writing tests! See the below Kotlin example:

```kotlin
/**
* Here's an example of a test method. This method will get loaded up by JUnit 5's
* test framework and be executed.
*
* Note that each test method annotated with @PartiQLTest needs to take in an implementation of a PartiQLTestCase and a PartiQLResult.
* Note that PartiQLResult is a sealed interface -- you can opt to assume the variant that will be returned, or you can
* just take in a PartiQLResult.
*/
@PartiQLTest(provider = SimpleTestProvider::class)
fun simpleTest(tc: SimpleTestCase, result: PartiQLResult.Value) {
val exprValue = result.value
assertEquals(ExprValueType.BOOL, exprValue.type)
assertEquals(tc.expected, exprValue.booleanValue())
}

/**
* PartiQLTestProviders represent a set of tests aimed at testing a single query.
*/
class SimpleTestProvider : PartiQLTestProvider {
override val statement: String = "EXISTS(SELECT * FROM << x >> AS t WHERE t < 7)"
override fun getTestCases(): List<PartiQLTestCase> = listOf(
SimpleTestCase(x = 6, expected = true),
SimpleTestCase(x = 8, expected = false)
)
}

/**
* An implementation of a PartiQLTestCase.
*/
class SimpleTestCase(private val x: Int, val expected: Boolean) : PartiQLTestCase {
override val session: EvaluationSession = EvaluationSession.builder {
globals(mapOf("x" to x))
}
}
```

In the above example, we are testing a PartiQL query: `x < 7`. Note that the `SimpleTestProvider` provides two test cases:
1. The first makes the variable `x` equal to 6. Therefore, the PartiQL query is expected to return true.
2. The second makes the variable `x` equal to 8. Therefore, the PartiQL query is expected to return false.

## Report Generation

The current and only reporting format supported by PartiQL Code Coverage is LCOV. Upon the execution of test methods annotated
with `@PartiQLTest`, the PartiQL Code Coverage library will generate a report specified by the corresponding system property.
See the `All System Properties` further above for more information.
Loading

1 comment on commit 48cfc76

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JMH Benchmark

Benchmark suite Current: 48cfc76 Previous: 674e140 Ratio
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLCompiler15 178.72880044921402 us/op 173.28623180313798 us/op 1.03
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLCompiler30 343.1995335721582 us/op 327.17677234913214 us/op 1.05
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLEvaluator15 646088.6135750001 us/op 625843.1439250001 us/op 1.03
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLEvaluator30 1321858.9825 us/op 1241850.4539499998 us/op 1.06
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLEvaluator30WithData10 13410078.458649997 us/op 12015138.010550002 us/op 1.12
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLParser15 259.6142527365643 us/op 263.87123715049756 us/op 0.98
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLParser30 531.9604459883622 us/op 469.2507666803398 us/op 1.13
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameCaseWhenThen 80.64383732659414 us/op 79.09451365326231 us/op 1.02
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameComplexQuery 95.70877075206238 us/op 93.96525954920098 us/op 1.02
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameComplexQuery01 474.92882654587163 us/op 458.12290510937476 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameComplexQuery02 775.9352615866673 us/op 763.0178546749032 us/op 1.02
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameExceptUnionIntersectSixty 300.73796440129786 us/op 288.4438167275681 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameExec20Expressions 101.28670752545915 us/op 103.20373411905044 us/op 0.98
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameFromLet 82.8236997836789 us/op 80.60459158243673 us/op 1.03
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameGraphPattern 80.3406339923839 us/op 79.05286214796406 us/op 1.02
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameGraphPreFilters 136.91368842692088 us/op 124.80667234495418 us/op 1.10
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameGroupLimit 90.98976329103556 us/op 83.89035416048063 us/op 1.08
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameLongFromSourceOrderBy 103.87608944430455 us/op 99.09098959770185 us/op 1.05
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameManyJoins 111.61499123819821 us/op 113.91576317335708 us/op 0.98
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameNestedAggregates 172.25975587804848 us/op 169.48573307879698 us/op 1.02
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameNestedParen 33.93050331659701 us/op 33.484002626841615 us/op 1.01
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNamePivot 114.740581655814 us/op 117.04190338879792 us/op 0.98
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQuery15OrsAndLikes 370.33814594847115 us/op 360.3031987154989 us/op 1.03
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQuery30Plus 168.7217122612772 us/op 176.91015309760238 us/op 0.95
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryFunc 84.77010997910915 us/op 85.77358050680908 us/op 0.99
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryFuncInProjection 181.29437584702512 us/op 187.30594282034042 us/op 0.97
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryList 130.96025173354622 us/op 125.43075184512354 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryNestedSelect 1003.7138114060679 us/op 1068.697552079768 us/op 0.94
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQuerySimple 31.433866051209954 us/op 29.206483918454133 us/op 1.08
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSeveralJoins 43.325605110072104 us/op 45.99859345913034 us/op 0.94
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSeveralProjections 116.65204196735635 us/op 112.69498675864494 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSeveralSelect 322.7915741774219 us/op 317.959312227876 us/op 1.02
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSimpleInsert 57.58120271559486 us/op 57.81775283159415 us/op 1.00
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSomeJoins 42.57099183364664 us/op 43.8155606884586 us/op 0.97
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSomeProjections 54.86487935475044 us/op 53.89091972560946 us/op 1.02
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSomeSelect 94.26490753485137 us/op 88.96296577061756 us/op 1.06
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameTimeZone 46.46920995719104 us/op 44.33445646106494 us/op 1.05
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameVeryLongQuery 484.7345537872412 us/op 488.72043774886254 us/op 0.99
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameVeryLongQuery01 1597.3379582614539 us/op 1592.3638968678356 us/op 1.00
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameCaseWhenThen 41.66209978907222 us/op 42.30665918588207 us/op 0.98
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameComplexQuery 354.3540294170699 us/op 341.5538907839149 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameComplexQuery01 164.05898099096774 us/op 163.73872919696154 us/op 1.00
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameExceptUnionIntersectSixty 304.079712586038 us/op 303.7135109093832 us/op 1.00
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameExec20Expressions 88.20110026608293 us/op 84.97989158443221 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameFromLet 60.188883763064396 us/op 57.098532521534274 us/op 1.05
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameGraphPattern 68.95324416130804 us/op 68.5331841889762 us/op 1.01
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameGraphPreFilters 114.05365678537612 us/op 114.34625396840484 us/op 1.00
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameGroupLimit 60.3836461511552 us/op 59.739002737833616 us/op 1.01
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameLongFromSourceOrderBy 191.93420123189975 us/op 204.7493763846791 us/op 0.94
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameManyJoins 74.28403577655229 us/op 71.06794766227627 us/op 1.05
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameNestedAggregates 152.32632600085486 us/op 147.75429693542972 us/op 1.03
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameNestedParen 115.50325203165656 us/op 126.2859248281035 us/op 0.91
org.partiql.jmh.benchmarks.ParserBenchmark.parseNamePivot 105.83884629591162 us/op 100.64832559999407 us/op 1.05
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQuery15OrsAndLikes 263.7414506441145 us/op 264.71938524337764 us/op 1.00
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQuery30Plus 87.41819650195751 us/op 84.32234041467498 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryFunc 225.2646197773221 us/op 207.31802076337604 us/op 1.09
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryFuncInProjection 141.52659854881705 us/op 130.34248267485685 us/op 1.09
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryList 116.66656592626506 us/op 115.41199185332263 us/op 1.01
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryNestedSelect 217.7716228736805 us/op 207.32708423618 us/op 1.05
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQuerySimple 22.25138069569764 us/op 21.515287772190554 us/op 1.03
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSeveralJoins 117.20917517228456 us/op 108.99888381112365 us/op 1.08
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSeveralProjections 87.83962434306282 us/op 84.55175457882844 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSeveralSelect 163.17392933618441 us/op 156.3411494036756 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSimpleInsert 37.91607054463147 us/op 36.622111396618685 us/op 1.04
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSomeJoins 36.217590051633344 us/op 33.98588454166591 us/op 1.07
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSomeProjections 31.02896340158524 us/op 30.748723129748775 us/op 1.01
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSomeSelect 55.12300074840167 us/op 54.09479883190802 us/op 1.02
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameTimeZone 16.971017645704023 us/op 17.622569222369595 us/op 0.96
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameVeryLongQuery 615.3080985078745 us/op 599.4473055653195 us/op 1.03
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameVeryLongQuery01 1680.0652641744878 us/op 1608.0871193689375 us/op 1.04
org.partiql.jmh.benchmarks.PartiQLBenchmark.testPartiQLCompiler 16.547893402474184 us/op 15.875451706478168 us/op 1.04
org.partiql.jmh.benchmarks.PartiQLBenchmark.testPartiQLEvaluator 3.1213010548189972 us/op 3.142061017468475 us/op 0.99
org.partiql.jmh.benchmarks.PartiQLBenchmark.testPartiQLParser 21.330738289912652 us/op 19.52609888137622 us/op 1.09

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.