mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
261b13ef4b | ||
|
|
7639034d7c | ||
|
|
c71971eb5c | ||
|
|
357af58db4 | ||
|
|
0abdb1550a | ||
|
|
c32fc814f6 | ||
|
|
8e035939dc | ||
|
|
edf98ee250 | ||
|
|
5f0a75a130 | ||
|
|
d2f16cbf6a | ||
|
|
04ba81d12f | ||
|
|
f63e7ed5af | ||
|
|
66940c0f14 | ||
|
|
1f48b3a6b3 | ||
|
|
7d368097e9 | ||
|
|
c849e29316 | ||
|
|
c78a3dd6c4 | ||
|
|
a4455ddbf2 | ||
|
|
9787af77e4 | ||
|
|
3786fb09a5 | ||
|
|
f34e7b6003 | ||
|
|
089dd8e364 | ||
|
|
44770382fb | ||
|
|
2a62d413cc | ||
|
|
0046d983cb | ||
|
|
006e33cb3e | ||
|
|
e80e8e027a | ||
|
|
2e1b52d7d4 | ||
|
|
09d5163396 | ||
|
|
a6a38b9a92 | ||
|
|
bd4521b240 | ||
|
|
8a7379879b | ||
|
|
b78dd6f79a | ||
|
|
4ebb5fd112 | ||
|
|
487368976f | ||
|
|
c6defceec9 | ||
|
|
8ed3b765ec | ||
|
|
fcbcc53e27 | ||
|
|
b377e1a618 | ||
|
|
a0f612ed71 | ||
|
|
47e97a77a8 | ||
|
|
e8d3f50bb4 | ||
|
|
716cfaf938 | ||
|
|
7cd9e5ee03 | ||
|
|
f9c9bea623 | ||
|
|
720832122c | ||
|
|
7b635acf56 | ||
|
|
6b7efe65d7 | ||
|
|
03cd4000f0 | ||
|
|
dfd6434b59 | ||
|
|
4e7480237b | ||
|
|
9bfcf07486 | ||
|
|
b1f1344057 | ||
|
|
07201c1519 | ||
|
|
455a9fdffc | ||
|
|
3f67425727 | ||
|
|
3fd9ae06db | ||
|
|
a8ce726e47 | ||
|
|
29cd1a143d | ||
|
|
6a19c6a0ce | ||
|
|
eaec515cc1 | ||
|
|
97709d3493 | ||
|
|
87ad874621 | ||
|
|
dfe95f6fc0 | ||
|
|
05feccfeb6 | ||
|
|
196cb09c66 | ||
|
|
589e198301 | ||
|
|
b2b81677e8 | ||
|
|
f032aad22e | ||
|
|
c48e5428c5 | ||
|
|
cbca940611 | ||
|
|
0da3772ae9 | ||
|
|
496ef36b11 | ||
|
|
a4a2aba56f | ||
|
|
803f1d8642 | ||
|
|
ff1c73e20d | ||
|
|
7afd37cd98 | ||
|
|
24bb364d40 | ||
|
|
5d54a238bd | ||
|
|
b50ce5fc3f | ||
|
|
624e92840c | ||
|
|
b03adc412c | ||
|
|
e794f5e916 | ||
|
|
a2551ce718 | ||
|
|
5b0a3607f6 | ||
|
|
bcf7bd17be | ||
|
|
102d8d5979 | ||
|
|
3edc232003 | ||
|
|
043dc5c51f | ||
|
|
e2d666df35 | ||
|
|
314e0a14b8 | ||
|
|
1f9cf1e4b7 | ||
|
|
12029ed06e | ||
|
|
89741b9312 | ||
|
|
ae962c2e08 | ||
|
|
4e3501972a | ||
|
|
a65ba41850 | ||
|
|
3b11c1cb6b | ||
|
|
41185eeb5c | ||
|
|
e97ff54ab2 | ||
|
|
97fae09c52 | ||
|
|
8b0f58b3c2 | ||
|
|
70eb557929 | ||
|
|
fdb3a3759b | ||
|
|
7a5e8d0e17 | ||
|
|
a0748f8139 | ||
|
|
9f65673f54 | ||
|
|
8f6a3c59d1 | ||
|
|
05210ec411 | ||
|
|
faffda8318 | ||
|
|
af3901ce01 | ||
|
|
acd538207f | ||
|
|
84f0ef9fce | ||
|
|
7ab447b21c | ||
|
|
6f8805a6b3 | ||
|
|
0171c1afef | ||
|
|
31c106f604 | ||
|
|
20d2838be4 | ||
|
|
4238a951ca | ||
|
|
b5d4bed615 | ||
|
|
3ef715ef64 | ||
|
|
aea39528ab | ||
|
|
dd498409e0 | ||
|
|
bae33101df | ||
|
|
e1972ac544 | ||
|
|
c7241ba3dc | ||
|
|
73416ed65a | ||
|
|
cd70c178f1 | ||
|
|
aa298235f3 | ||
|
|
8733fed14b | ||
|
|
169d170247 | ||
|
|
d0ee42e0de | ||
|
|
91ecc074a7 | ||
|
|
c2b381af1e | ||
|
|
eeb0a15617 | ||
|
|
6abed0dd73 | ||
|
|
1318cd706f | ||
|
|
1e8c609dec | ||
|
|
4506596379 | ||
|
|
0b2c016af2 | ||
|
|
29d946ec59 | ||
|
|
da76b422c8 | ||
|
|
a1a3b33fc6 | ||
|
|
7ecd7877d5 | ||
|
|
e5f64f4211 | ||
|
|
90a6b71b7e | ||
|
|
131d531922 | ||
|
|
5684919a9f | ||
|
|
80fc0723c8 | ||
|
|
3ae4c8981e | ||
|
|
b80c67286b | ||
|
|
0bead4135e | ||
|
|
ac6473e039 | ||
|
|
32188bdd54 | ||
|
|
b3a577e3f9 | ||
|
|
7d1774e2ed | ||
|
|
395edb62bf | ||
|
|
716b7e7b93 | ||
|
|
9aadc347d7 | ||
|
|
d2d1423c88 | ||
|
|
73cfea6053 | ||
|
|
1614166d75 | ||
|
|
3d9b122a9f | ||
|
|
1cc1d29c2f |
@@ -34,6 +34,8 @@ jobs:
|
||||
path:
|
||||
~/.m2
|
||||
key: build-${{ env.cache-name }}
|
||||
- name: Maven version
|
||||
run: mvn --version
|
||||
- name: Build with Maven
|
||||
run: mvn package
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-clickhouse</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-postgres</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-db2</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-h2</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-hana</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-mariadb</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-mysql</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-nuodb</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-oracle</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
<name>ebean-postgis</name>
|
||||
<description>ebean-postgis composite</description>
|
||||
<artifactId>ebean-postgis</artifactId>
|
||||
|
||||
<properties>
|
||||
<postgis.jdbc.version>2.5.1</postgis.jdbc.version>
|
||||
<postgres.jdbc.version>42.6.0</postgres.jdbc.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-datasource</artifactId>
|
||||
<version>${ebean-datasource.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-migration</artifactId>
|
||||
<version>${ebean-migration.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Technically optional but most expected to use query beans -->
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-postgres</artifactId>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-postgis-types</artifactId>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>${postgres.jdbc.version}</version>
|
||||
<exclusions>
|
||||
<!-- exclude unnecessary checker framework -->
|
||||
<exclusion>
|
||||
<groupId>*</groupId>
|
||||
<artifactId>*</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.postgis</groupId>
|
||||
<artifactId>postgis-jdbc</artifactId>
|
||||
<version>${postgis.jdbc.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,7 @@
|
||||
package io.ebean.postgis.assembly;
|
||||
|
||||
/**
|
||||
* Nothing interesting here - required placeholder for javadoc.
|
||||
*/
|
||||
public class Assembly {
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
module io.ebean.postgis {
|
||||
|
||||
requires transitive io.ebean.api;
|
||||
requires transitive io.ebean.core;
|
||||
requires transitive io.ebean.datasource;
|
||||
requires transitive io.ebean.querybean;
|
||||
requires transitive io.ebean.platform.postgres;
|
||||
// requires transitive io.ebean.postgis.types;
|
||||
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-postgres</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-sqlite</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-sqlserver</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -42,13 +42,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-postgres</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<relativePath>../..</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -17,31 +17,31 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-joda-time</artifactId>
|
||||
<version>13.18.0</version>
|
||||
<version>13.24.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-jackson-jsonnode</artifactId>
|
||||
<version>13.18.0</version>
|
||||
<version>13.24.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-jackson-mapper</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -60,13 +60,13 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-all</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
+2
-1
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>composites</artifactId>
|
||||
@@ -23,6 +23,7 @@
|
||||
<module>ebean-nuodb</module>
|
||||
<module>ebean-oracle</module>
|
||||
<module>ebean-postgres</module>
|
||||
<module>ebean-postgis</module>
|
||||
<!-- <module>sqlanywhere</module>-->
|
||||
<module>ebean-sqlite</module>
|
||||
<module>ebean-sqlserver</module>
|
||||
|
||||
+2
-9
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</parent>
|
||||
|
||||
<name>ebean api</name>
|
||||
@@ -39,7 +39,7 @@
|
||||
<dependency>
|
||||
<groupId>io.avaje</groupId>
|
||||
<artifactId>avaje-config</artifactId>
|
||||
<version>3.8</version>
|
||||
<version>3.10</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -107,13 +107,6 @@
|
||||
</dependency>
|
||||
<!-- JAKARTA-DEPENDENCY-END -->
|
||||
|
||||
<dependency>
|
||||
<groupId>io.avaje</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>1.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
package io.ebean;
|
||||
|
||||
final class DInsertOptionsBuilder implements InsertOptions.Builder {
|
||||
|
||||
private Boolean getGeneratedKeys;
|
||||
private boolean onConflictUpdate;
|
||||
private boolean onConflictNothing;
|
||||
private String constraint;
|
||||
private String uniqueColumns;
|
||||
private String updateSet;
|
||||
|
||||
@Override
|
||||
public InsertOptions.Builder onConflictNothing() {
|
||||
this.onConflictNothing = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InsertOptions.Builder onConflictUpdate() {
|
||||
this.onConflictUpdate = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InsertOptions.Builder constraint(String constraint) {
|
||||
this.constraint = constraint;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InsertOptions.Builder uniqueColumns(String uniqueColumns) {
|
||||
this.uniqueColumns = uniqueColumns;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InsertOptions.Builder updateSet(String updateSet) {
|
||||
this.updateSet = updateSet;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InsertOptions.Builder getGeneratedKeys(boolean getGeneratedKeys) {
|
||||
this.getGeneratedKeys = getGeneratedKeys;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InsertOptions build() {
|
||||
return new Options(constraint, uniqueColumns, updateSet, onConflictUpdate, onConflictNothing, getGeneratedKeys);
|
||||
}
|
||||
|
||||
static final class Options implements InsertOptions {
|
||||
|
||||
private static final String UPDATE = "U";
|
||||
private static final String NOTHING = "N";
|
||||
private static final String NORMAL = "_";
|
||||
private final String key;
|
||||
private final Boolean getGeneratedKeys;
|
||||
private final String constraint;
|
||||
private final String uniqueColumns;
|
||||
private final String updateSet;
|
||||
|
||||
Options(String constraint, String uniqueColumns, String updateSet, boolean onConflictUpdate, boolean onConflictNothing, Boolean getGeneratedKeys) {
|
||||
this.constraint = constraint;
|
||||
this.uniqueColumns = uniqueColumns;
|
||||
this.updateSet = updateSet;
|
||||
this.getGeneratedKeys = getGeneratedKeys;
|
||||
this.key = (onConflictUpdate ? UPDATE : onConflictNothing ? NOTHING : NORMAL)
|
||||
+ '+' + plus(constraint)
|
||||
+ '+' + plus(uniqueColumns)
|
||||
+ '+' + plus(updateSet);
|
||||
}
|
||||
|
||||
private String plus(String val) {
|
||||
return val == null ? "" : val;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String key() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String constraint() {
|
||||
return constraint;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String uniqueColumns() {
|
||||
return uniqueColumns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String updateSet() {
|
||||
return updateSet;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean getGetGeneratedKeys() {
|
||||
return getGeneratedKeys;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -42,7 +42,7 @@ import java.util.concurrent.Callable;
|
||||
* <h5>Constructing a Database</h5>
|
||||
* <p>
|
||||
* Databases are constructed by the DatabaseFactory. They can be created
|
||||
* programmatically via {@link DatabaseFactory#create(DatabaseConfig)} or they
|
||||
* programmatically via {@link DatabaseFactory#create(DatabaseBuilder)} or they
|
||||
* can be automatically constructed on demand using configuration information in
|
||||
* the application.properties file.
|
||||
*
|
||||
@@ -86,6 +86,23 @@ import java.util.concurrent.Callable;
|
||||
@NonNullApi
|
||||
public interface Database {
|
||||
|
||||
/**
|
||||
* Return a new database builder.
|
||||
* <pre>{@code
|
||||
*
|
||||
* // build the 'default' database using configuration
|
||||
* // from application.properties / application.yaml
|
||||
*
|
||||
* Database db = Database.builder()
|
||||
* .loadFromProperties()
|
||||
* .build();
|
||||
*
|
||||
* }</pre>
|
||||
*/
|
||||
static DatabaseBuilder builder() {
|
||||
return new DatabaseConfig();
|
||||
}
|
||||
|
||||
/**
|
||||
* Shutdown the Database instance.
|
||||
*/
|
||||
@@ -1210,22 +1227,53 @@ public interface Database {
|
||||
*/
|
||||
void insert(Object bean);
|
||||
|
||||
/**
|
||||
* Insert the bean with options (ON CONFLICT DO UPDATE | DO NOTHING).
|
||||
* <p>
|
||||
* Currently, this is limited to use with Postgres only,
|
||||
* <p>
|
||||
* When using this ebean will look to determine the unique columns by looking at
|
||||
* the mapping like {@code @Column(unique=true} and {@code @Index(unique=true}.
|
||||
*/
|
||||
void insert(Object bean, InsertOptions insertOptions);
|
||||
|
||||
/**
|
||||
* Insert the bean with a transaction.
|
||||
*/
|
||||
void insert(Object bean, Transaction transaction);
|
||||
|
||||
/**
|
||||
* Insert the beans with options (ON CONFLICT DO UPDATE | DO NOTHING) and transaction.
|
||||
* <p>
|
||||
* Currently, this is limited to use with Postgres only,
|
||||
*/
|
||||
void insert(Object bean, InsertOptions insertOptions, Transaction transaction);
|
||||
|
||||
/**
|
||||
* Insert a collection of beans. If there is no current transaction one is created and used to
|
||||
* insert all the beans in the collection.
|
||||
*/
|
||||
void insertAll(Collection<?> beans);
|
||||
|
||||
/**
|
||||
* Insert the beans with options - typically ON CONFLICT DO UPDATE | DO NOTHING.
|
||||
* <p>
|
||||
* Currently, this is limited to use with Postgres only,
|
||||
*/
|
||||
void insertAll(Collection<?> beans, InsertOptions options);
|
||||
|
||||
/**
|
||||
* Insert a collection of beans with an explicit transaction.
|
||||
*/
|
||||
void insertAll(Collection<?> beans, Transaction transaction);
|
||||
|
||||
/**
|
||||
* Insert the beans with options (ON CONFLICT DO UPDATE | DO NOTHING) and transaction.
|
||||
* <p>
|
||||
* Currently, this is limited to use with Postgres only,
|
||||
*/
|
||||
void insertAll(Collection<?> beans, InsertOptions options, Transaction transaction);
|
||||
|
||||
/**
|
||||
* Execute explicitly passing a transaction.
|
||||
*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,13 +1,11 @@
|
||||
package io.ebean;
|
||||
|
||||
import io.ebean.config.ContainerConfig;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.service.SpiContainer;
|
||||
import io.ebean.service.SpiContainerFactory;
|
||||
|
||||
import jakarta.persistence.PersistenceException;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Properties;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
@@ -76,9 +74,10 @@ public final class DatabaseFactory {
|
||||
*
|
||||
* }</pre>
|
||||
*/
|
||||
public static Database create(DatabaseConfig config) {
|
||||
public static Database create(DatabaseBuilder builder) {
|
||||
lock.lock();
|
||||
try {
|
||||
var config = builder.settings();
|
||||
if (config.getName() == null) {
|
||||
throw new PersistenceException("The name is null (it is required)");
|
||||
}
|
||||
@@ -102,7 +101,7 @@ public final class DatabaseFactory {
|
||||
/**
|
||||
* Create using the DatabaseConfig additionally specifying a classLoader to use as the context class loader.
|
||||
*/
|
||||
public static Database createWithContextClassLoader(DatabaseConfig config, ClassLoader classLoader) {
|
||||
public static Database createWithContextClassLoader(DatabaseBuilder config, ClassLoader classLoader) {
|
||||
lock.lock();
|
||||
try {
|
||||
ClassLoader currentContextLoader = Thread.currentThread().getContextClassLoader();
|
||||
@@ -132,7 +131,7 @@ public final class DatabaseFactory {
|
||||
}
|
||||
}
|
||||
|
||||
private static Database createInternal(DatabaseConfig config) {
|
||||
private static Database createInternal(DatabaseBuilder.Settings config) {
|
||||
return container(config.getContainerConfig()).createServer(config);
|
||||
}
|
||||
|
||||
@@ -146,12 +145,9 @@ public final class DatabaseFactory {
|
||||
if (container != null) {
|
||||
return container;
|
||||
}
|
||||
|
||||
if (containerConfig == null) {
|
||||
// effectively load configuration from ebean.properties
|
||||
Properties properties = DbPrimary.getProperties();
|
||||
containerConfig = new ContainerConfig();
|
||||
containerConfig.loadFromProperties(properties);
|
||||
}
|
||||
container = createContainer(containerConfig);
|
||||
return container;
|
||||
@@ -160,7 +156,7 @@ public final class DatabaseFactory {
|
||||
/**
|
||||
* Create the container instance using the configuration.
|
||||
*/
|
||||
protected static SpiContainer createContainer(ContainerConfig containerConfig) {
|
||||
private static SpiContainer createContainer(ContainerConfig containerConfig) {
|
||||
Iterator<SpiContainerFactory> factories = ServiceLoader.load(SpiContainerFactory.class).iterator();
|
||||
if (factories.hasNext()) {
|
||||
return factories.next().create(containerConfig);
|
||||
|
||||
@@ -44,25 +44,12 @@ final class DbPrimary {
|
||||
* Return the default database name.
|
||||
*/
|
||||
static String getDefaultServerName() {
|
||||
lock.lock();
|
||||
try {
|
||||
getProperties();
|
||||
return defaultServerName;
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the default configuration Properties.
|
||||
*/
|
||||
static Properties getProperties() {
|
||||
lock.lock();
|
||||
try {
|
||||
if (defaultServerName == null) {
|
||||
defaultServerName = determineDefaultServerName();
|
||||
}
|
||||
return Config.asProperties();
|
||||
return defaultServerName;
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@ package io.ebean;
|
||||
import io.avaje.lang.NonNullApi;
|
||||
import io.avaje.lang.Nullable;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.Connection;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -206,14 +208,19 @@ public interface DtoQuery<T> extends CancelableQuery {
|
||||
*/
|
||||
DtoQuery<T> usingTransaction(Transaction transaction);
|
||||
|
||||
/**
|
||||
* Execute the query using the given connection.
|
||||
*/
|
||||
DtoQuery<T> usingConnection(Connection connection);
|
||||
|
||||
/**
|
||||
* Ensure that the master DataSource is used if there is a read only data source
|
||||
* being used (that is using a read replica database potentially with replication lag).
|
||||
* <p>
|
||||
* When the database is configured with a read-only DataSource via
|
||||
* say {@link io.ebean.config.DatabaseConfig#setReadOnlyDataSource(DataSource)} then
|
||||
* say {@link io.ebean.DatabaseBuilder#readOnlyDataSource(DataSource)} then
|
||||
* by default when a query is run without an active transaction, it uses the read-only data
|
||||
* source. We we use {@code usingMaster()} to instead ensure that the query is executed
|
||||
* source. We use {@code usingMaster()} to instead ensure that the query is executed
|
||||
* against the master data source.
|
||||
*/
|
||||
DtoQuery<T> usingMaster();
|
||||
|
||||
@@ -54,7 +54,7 @@ public interface ExpressionList<T> {
|
||||
Query<T> orderById(boolean orderById);
|
||||
|
||||
/**
|
||||
* Deprecated migrate to {@link #orderBy(String)}
|
||||
* @deprecated migrate to {@link #orderBy(String)}
|
||||
*/
|
||||
@Deprecated(since = "13.19", forRemoval = true)
|
||||
default ExpressionList<T> order(String orderByClause) {
|
||||
@@ -72,7 +72,7 @@ public interface ExpressionList<T> {
|
||||
ExpressionList<T> orderBy(String orderBy);
|
||||
|
||||
/**
|
||||
* Deprecated migrate to orderBy().
|
||||
* @deprecated migrate to {@link #orderBy()}.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
default OrderBy<T> order() {
|
||||
@@ -508,7 +508,7 @@ public interface ExpressionList<T> {
|
||||
ExpressionList<T> filterMany(String manyProperty);
|
||||
|
||||
/**
|
||||
* Deprecated for removal - migrate to filterManyRaw()
|
||||
* @deprecated for removal - migrate to {@link #filterManyRaw(String, String, Object...)}.
|
||||
* <p>
|
||||
* Add filter expressions to the many property.
|
||||
*
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
package io.ebean;
|
||||
|
||||
import io.avaje.lang.Nullable;
|
||||
|
||||
/**
|
||||
* Options to be used with insert such as ON CONFLICT DO UPDATE | NOTHING.
|
||||
*/
|
||||
public interface InsertOptions {
|
||||
|
||||
/**
|
||||
* Use ON CONFLICT UPDATE with automatic determination of the unique columns to conflict on.
|
||||
* <p>
|
||||
* Uses mapping to determine the unique columns - {@code @Column(unique=true)} and {@code @Index(unique=true)} .
|
||||
*/
|
||||
InsertOptions ON_CONFLICT_UPDATE = InsertOptions.builder()
|
||||
.onConflictUpdate()
|
||||
.build();
|
||||
|
||||
/**
|
||||
* Use ON CONFLICT DO NOTHING with automatic determination of the unique columns to conflict on.
|
||||
* <p>
|
||||
* Uses mapping to determine the unique columns - {@code @Column(unique=true)} and {@code @Index(unique=true)} .
|
||||
*/
|
||||
InsertOptions ON_CONFLICT_NOTHING = InsertOptions.builder()
|
||||
.onConflictNothing()
|
||||
.build();
|
||||
|
||||
/**
|
||||
* Return a builder for InsertOptions.
|
||||
*/
|
||||
static Builder builder() {
|
||||
return new DInsertOptionsBuilder();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the constraint name that is used for ON CONFLICT.
|
||||
*/
|
||||
@Nullable
|
||||
String constraint();
|
||||
|
||||
/**
|
||||
* Return the unique columns that is used for ON CONFLICT.
|
||||
* <p>
|
||||
* When not explicitly set will use mapping like {@code @Column(unique=true)} to determine the
|
||||
* non-unique columns.
|
||||
*/
|
||||
@Nullable
|
||||
String uniqueColumns();
|
||||
|
||||
/**
|
||||
* Return the ON CONFLICT UPDATE SET clause.
|
||||
* <p>
|
||||
* When not set will use the non-unique columns.
|
||||
*/
|
||||
@Nullable
|
||||
String updateSet();
|
||||
|
||||
/**
|
||||
* Return if GetGeneratedKeys should be used to fetch the generated keys after insert.
|
||||
*/
|
||||
@Nullable
|
||||
Boolean getGetGeneratedKeys();
|
||||
|
||||
/**
|
||||
* Return the key for these build options.
|
||||
*/
|
||||
String key();
|
||||
|
||||
/**
|
||||
* The builder for InsertOptions.
|
||||
*/
|
||||
interface Builder {
|
||||
|
||||
/**
|
||||
* Use a ON CONFLICT UPDATE automatically determining the unique columns.
|
||||
*/
|
||||
Builder onConflictUpdate();
|
||||
|
||||
/**
|
||||
* Use a ON CONFLICT DO NOTHING automatically determining the unique columns.
|
||||
*/
|
||||
Builder onConflictNothing();
|
||||
|
||||
/**
|
||||
* Specify an explicit conflict constraint name.
|
||||
* <p>
|
||||
* When this is used then unique columns will not be used.
|
||||
*/
|
||||
Builder constraint(String constraint);
|
||||
|
||||
/**
|
||||
* Specify the unique columns for the conflict target.
|
||||
* <p>
|
||||
* When not specified and constraint is also not specified then
|
||||
* it will automatically determine the unique columns
|
||||
* based on mapping like {@code @Column(unique=true)} and
|
||||
* {@code @Index(unique=true)} .
|
||||
*/
|
||||
Builder uniqueColumns(String uniqueColumns);
|
||||
|
||||
/**
|
||||
* Specify the ON CONFLICT DO UPDATE SET clause.
|
||||
* <p>
|
||||
* When not specified ebean will include all the non-unique columns.
|
||||
*/
|
||||
Builder updateSet(String updateSet);
|
||||
|
||||
/**
|
||||
* Specify if GetGeneratedKeys should be used to return generated keys.
|
||||
*/
|
||||
Builder getGeneratedKeys(boolean getGeneratedKeys);
|
||||
|
||||
/**
|
||||
* Build and return the insert options.
|
||||
*/
|
||||
InsertOptions build();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -702,9 +702,9 @@ public interface Query<T> extends CancelableQuery {
|
||||
* being used (that is using a read replica database potentially with replication lag).
|
||||
* <p>
|
||||
* When the database is configured with a read-only DataSource via
|
||||
* say {@link io.ebean.config.DatabaseConfig#setReadOnlyDataSource(DataSource)} then
|
||||
* say {@link io.ebean.DatabaseBuilder#readOnlyDataSource(DataSource)} then
|
||||
* by default when a query is run without an active transaction, it uses the read-only data
|
||||
* source. We we use {@code usingMaster()} to instead ensure that the query is executed
|
||||
* source. We use {@code usingMaster()} to instead ensure that the query is executed
|
||||
* against the master data source.
|
||||
*/
|
||||
Query<T> usingMaster();
|
||||
@@ -970,6 +970,25 @@ public interface Query<T> extends CancelableQuery {
|
||||
@Nullable
|
||||
<A> A findSingleAttribute();
|
||||
|
||||
/**
|
||||
* Execute the query returning a single optional attribute value.
|
||||
* <p>
|
||||
* <h3>Example</h3>
|
||||
* <pre>{@code
|
||||
*
|
||||
* Optional<String> maybeName =
|
||||
* new QCustomer()
|
||||
* .select(name)
|
||||
* .id.eq(42)
|
||||
* .status.eq(NEW)
|
||||
* .findSingleAttributeOrEmpty();
|
||||
*
|
||||
* }</pre>
|
||||
*
|
||||
* @return an optional value for the selected property
|
||||
*/
|
||||
<A> Optional<A> findSingleAttributeOrEmpty();
|
||||
|
||||
/**
|
||||
* Return true if this is countDistinct query.
|
||||
*/
|
||||
@@ -1396,7 +1415,7 @@ public interface Query<T> extends CancelableQuery {
|
||||
Query<T> orderBy(String orderByClause);
|
||||
|
||||
/**
|
||||
* Deprecated migrate to orderBy().
|
||||
* @deprecated migrate to {@link #orderBy()}.
|
||||
*/
|
||||
@Deprecated(since = "13.19", forRemoval = true)
|
||||
default Query<T> order(String orderByClause) {
|
||||
@@ -1415,7 +1434,7 @@ public interface Query<T> extends CancelableQuery {
|
||||
OrderBy<T> orderBy();
|
||||
|
||||
/**
|
||||
* Deprecated migrate to orderBy().
|
||||
* @deprecated migrate to {@link #orderBy()}.
|
||||
*/
|
||||
@Deprecated(since = "13.19", forRemoval = true)
|
||||
default OrderBy<T> order() {
|
||||
@@ -1428,7 +1447,7 @@ public interface Query<T> extends CancelableQuery {
|
||||
Query<T> setOrderBy(OrderBy<T> orderBy);
|
||||
|
||||
/**
|
||||
* Deprecated migrate to setOrderBy().
|
||||
* @deprecated migrate to {@link #setOrderBy(OrderBy)}.
|
||||
*/
|
||||
@Deprecated(since = "13.19", forRemoval = true)
|
||||
default Query<T> setOrder(OrderBy<T> orderBy) {
|
||||
|
||||
@@ -3,7 +3,9 @@ package io.ebean;
|
||||
import io.avaje.lang.NonNullApi;
|
||||
import io.avaje.lang.Nullable;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.io.Serializable;
|
||||
import java.sql.Connection;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Consumer;
|
||||
@@ -45,14 +47,19 @@ public interface SqlQuery extends Serializable, CancelableQuery {
|
||||
*/
|
||||
SqlQuery usingTransaction(Transaction transaction);
|
||||
|
||||
/**
|
||||
* Execute the query using the given connection.
|
||||
*/
|
||||
SqlQuery usingConnection(Connection connection);
|
||||
|
||||
/**
|
||||
* Ensure that the master DataSource is used if there is a read only data source
|
||||
* being used (that is using a read replica database potentially with replication lag).
|
||||
* <p>
|
||||
* When the database is configured with a read-only DataSource via
|
||||
* say {@link io.ebean.config.DatabaseConfig#setReadOnlyDataSource(DataSource)} then
|
||||
* say {@link io.ebean.DatabaseBuilder#readOnlyDataSource(DataSource)}then
|
||||
* by default when a query is run without an active transaction, it uses the read-only data
|
||||
* source. We we use {@code usingMaster()} to instead ensure that the query is executed
|
||||
* source. We use {@code usingMaster()} to instead ensure that the query is executed
|
||||
* against the master data source.
|
||||
*/
|
||||
SqlQuery usingMaster();
|
||||
|
||||
@@ -9,7 +9,6 @@ import java.util.Collection;
|
||||
* <p>
|
||||
* This is currently deemed to be experimental and subject to change.
|
||||
*/
|
||||
@Deprecated(since = "experimental")
|
||||
public final class StdOperators {
|
||||
|
||||
// ---- Functions ---- //
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package io.ebean.cache;
|
||||
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
/**
|
||||
* Plugin that provides a ServerCacheNotify implementation.
|
||||
@@ -12,5 +12,5 @@ public interface ServerCacheNotifyPlugin {
|
||||
/**
|
||||
* Create a ServerCacheNotify implementation given the server configuration.
|
||||
*/
|
||||
ServerCacheNotify create(DatabaseConfig config);
|
||||
ServerCacheNotify create(DatabaseBuilder config);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package io.ebean.cache;
|
||||
|
||||
import io.ebean.BackgroundExecutor;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
/**
|
||||
* The plugin interface that creates a ServerCacheFactory.
|
||||
@@ -11,5 +11,5 @@ public interface ServerCachePlugin {
|
||||
/**
|
||||
* Create the ServerCacheFactory given the server config and background executor service.
|
||||
*/
|
||||
ServerCacheFactory create(DatabaseConfig config, BackgroundExecutor executor);
|
||||
ServerCacheFactory create(DatabaseBuilder config, BackgroundExecutor executor);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package io.ebean.config;
|
||||
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
/**
|
||||
* Used to provide some automatic configuration early in the creation of a Database.
|
||||
*/
|
||||
@@ -8,11 +10,11 @@ public interface AutoConfigure {
|
||||
/**
|
||||
* Perform configuration for the DatabaseConfig prior to properties load.
|
||||
*/
|
||||
void preConfigure(DatabaseConfig config);
|
||||
void preConfigure(DatabaseBuilder config);
|
||||
|
||||
/**
|
||||
* Provide some configuration the DatabaseConfig prior to server creation but after properties have been applied.
|
||||
*/
|
||||
void postConfigure(DatabaseConfig config);
|
||||
void postConfigure(DatabaseBuilder config);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
package io.ebean.config;
|
||||
|
||||
import io.avaje.config.Config;
|
||||
import io.avaje.config.Configuration;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
@@ -15,8 +18,17 @@ public class ContainerConfig {
|
||||
private String namespace;
|
||||
private String podName;
|
||||
private int port;
|
||||
|
||||
private Properties properties;
|
||||
private Configuration configuration;
|
||||
|
||||
public ContainerConfig() {
|
||||
this.configuration = Config.asConfiguration();
|
||||
this.active = configuration.getBool("ebean.cluster.active", active);
|
||||
this.serviceName = configuration.getNullable("ebean.cluster.serviceName", serviceName);
|
||||
this.namespace = configuration.getNullable("ebean.cluster.namespace", namespace);
|
||||
this.podName = configuration.getNullable("ebean.cluster.podName", podName);
|
||||
this.port = configuration.getInt("ebean.cluster.port", 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the service name.
|
||||
@@ -92,7 +104,7 @@ public class ContainerConfig {
|
||||
* Return the deployment properties.
|
||||
*/
|
||||
public Properties getProperties() {
|
||||
return properties;
|
||||
return properties != null ? properties : configuration.asProperties();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -102,26 +114,4 @@ public class ContainerConfig {
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the settings from properties.
|
||||
*/
|
||||
public void loadFromProperties(Properties properties) {
|
||||
this.properties = properties;
|
||||
this.active = getProperty(properties, "ebean.cluster.active", active);
|
||||
this.serviceName = properties.getProperty("ebean.cluster.serviceName", serviceName);
|
||||
this.namespace = properties.getProperty("ebean.cluster.namespace", namespace);
|
||||
this.podName = properties.getProperty("ebean.cluster.podName", podName);
|
||||
String portParam = properties.getProperty("ebean.cluster.port");
|
||||
if (portParam != null) {
|
||||
this.port = Integer.parseInt(portParam);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the boolean property setting.
|
||||
*/
|
||||
protected boolean getProperty(Properties properties, String key, boolean defaultValue) {
|
||||
return "true".equalsIgnoreCase(properties.getProperty(key, Boolean.toString(defaultValue)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,7 @@
|
||||
package io.ebean.config;
|
||||
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
/**
|
||||
* Provides a ServiceLoader based mechanism to configure a DatabaseConfig.
|
||||
* <p>
|
||||
@@ -35,5 +37,5 @@ public interface DatabaseConfigProvider {
|
||||
* Typically we explicitly register entity bean classes and thus avoid classpath scanning.
|
||||
* </p>
|
||||
*/
|
||||
void apply(DatabaseConfig config);
|
||||
void apply(DatabaseBuilder config);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package io.ebean.event;
|
||||
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
/**
|
||||
* Used to configure the server on startup.
|
||||
@@ -13,6 +13,6 @@ public interface ServerConfigStartup {
|
||||
/**
|
||||
* On starting configure the DatabaseConfig.
|
||||
*/
|
||||
void onStart(DatabaseConfig config);
|
||||
void onStart(DatabaseBuilder config);
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ package io.ebean.event;
|
||||
import jakarta.servlet.ServletContextEvent;
|
||||
|
||||
/**
|
||||
* Deprecated for removal - no intention to replace. Create your own copy of this
|
||||
* ServletContextListener if needed for your application.
|
||||
* <p>
|
||||
* Listens for webserver server starting and stopping events.
|
||||
* <p>
|
||||
* This should be used when the deployment is into a servlet container where the webapp
|
||||
@@ -15,6 +18,7 @@ import jakarta.servlet.ServletContextEvent;
|
||||
* hook that Ebean registers.
|
||||
* </p>
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
public class ServletContextListener implements jakarta.servlet.ServletContextListener {
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,7 +3,7 @@ package io.ebean.plugin;
|
||||
import io.ebean.Database;
|
||||
import io.ebean.bean.BeanLoader;
|
||||
import io.ebean.bean.EntityBeanIntercept;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.config.dbplatform.DatabasePlatform;
|
||||
|
||||
import java.util.List;
|
||||
@@ -16,7 +16,7 @@ public interface SpiServer extends Database {
|
||||
/**
|
||||
* Return the DatabaseConfig.
|
||||
*/
|
||||
DatabaseConfig config();
|
||||
DatabaseBuilder.Settings config();
|
||||
|
||||
/**
|
||||
* Return the DatabasePlatform for this database.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package io.ebean.service;
|
||||
|
||||
import io.ebean.Database;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
/**
|
||||
* Creates the Database implementations. This is used internally by the EbeanServerFactory and is not currently
|
||||
@@ -14,7 +14,7 @@ public interface SpiContainer {
|
||||
*
|
||||
* @param configuration The configuration information for this database.
|
||||
*/
|
||||
Database createServer(DatabaseConfig configuration);
|
||||
Database createServer(DatabaseBuilder configuration);
|
||||
|
||||
/**
|
||||
* Create an EbeanServer just using the name.
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
/* Javadoc style sheet */
|
||||
|
||||
/* Define colors, fonts and other style attributes here to override the defaults */
|
||||
|
||||
/* Page background color */
|
||||
body {
|
||||
background-color: #FFFFFF;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
pre.code {
|
||||
padding: 1em;
|
||||
margin-left: 2em;
|
||||
border: 1px solid #ccc;
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
/* Headings */
|
||||
h1 {
|
||||
font-size: 14pt
|
||||
}
|
||||
|
||||
#overviewexamples h3 {
|
||||
font-size: 10pt
|
||||
}
|
||||
|
||||
/* Table colors */
|
||||
.TableHeadingColor {
|
||||
background: #CCCCFF
|
||||
}
|
||||
|
||||
/* Dark mauve */
|
||||
.TableSubHeadingColor {
|
||||
background: #EEEEFF
|
||||
}
|
||||
|
||||
/* Light mauve */
|
||||
.TableRowColor {
|
||||
background: #FFFFFF
|
||||
}
|
||||
|
||||
/* White */
|
||||
|
||||
/* Font used in left-hand frame lists */
|
||||
.FrameTitleFont {
|
||||
font-size: 12pt;
|
||||
font-family: Helvetica, Arial, sans-serif
|
||||
}
|
||||
|
||||
.FrameHeadingFont {
|
||||
font-size: 10pt;
|
||||
font-family: Helvetica, Arial, sans-serif
|
||||
}
|
||||
|
||||
.FrameItemFont {
|
||||
font-size: 10pt;
|
||||
font-family: Helvetica, Arial, sans-serif
|
||||
}
|
||||
|
||||
/* Navigation bar fonts and colors */
|
||||
.NavBarCell1 {
|
||||
background-color: #EEEEFF;
|
||||
}
|
||||
|
||||
/* Light mauve */
|
||||
.NavBarCell1Rev {
|
||||
background-color: #00008B;
|
||||
}
|
||||
|
||||
/* Dark Blue */
|
||||
.NavBarFont1 {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.NavBarFont1Rev {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.NavBarCell2 {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
|
||||
.NavBarCell3 {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
|
||||
@@ -21,9 +21,4 @@ class DbPrimaryTest {
|
||||
assertEquals("h2", DbPrimary.getDefaultServerName());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testLoadProperties() {
|
||||
Properties properties = DbPrimary.getProperties();
|
||||
assertFalse(properties.isEmpty());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.ebean.config;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.annotation.MutationDetection;
|
||||
import io.ebean.annotation.PersistBatch;
|
||||
import io.ebean.config.dbplatform.IdType;
|
||||
@@ -17,7 +18,7 @@ class DatabaseConfigTest {
|
||||
|
||||
@Test
|
||||
void testLoadFromEbeanProperties() {
|
||||
DatabaseConfig config = new DatabaseConfig();
|
||||
var config = new DatabaseConfig().settings();
|
||||
config.loadFromProperties();
|
||||
|
||||
assertEquals(PersistBatch.NONE, config.getPersistBatch());
|
||||
@@ -32,7 +33,7 @@ class DatabaseConfigTest {
|
||||
Properties props = new Properties();
|
||||
props.setProperty("ddl.initSql", "${user.home}" + fileSeparator + "initSql");
|
||||
|
||||
DatabaseConfig config = new DatabaseConfig();
|
||||
var config = new DatabaseConfig().settings();
|
||||
config.loadFromProperties(props);
|
||||
|
||||
String ddlInitSql = config.getDdlInitSql();
|
||||
@@ -41,7 +42,7 @@ class DatabaseConfigTest {
|
||||
|
||||
@Test
|
||||
void testLoadWithProperties() {
|
||||
DatabaseConfig config = new DatabaseConfig();
|
||||
DatabaseBuilder config = new DatabaseConfig();
|
||||
config.setPersistBatch(PersistBatch.NONE);
|
||||
config.setPersistBatchOnCascade(PersistBatch.NONE);
|
||||
config.setAutoReadOnlyDataSource(false);
|
||||
@@ -73,6 +74,7 @@ class DatabaseConfigTest {
|
||||
props.setProperty("forUpdateNoKey", "true");
|
||||
props.setProperty("defaultServer", "false");
|
||||
props.setProperty("skipDataSourceCheck", "true");
|
||||
props.setProperty("readOnlyDatabase", "true");
|
||||
|
||||
props.setProperty("queryPlan.enable", "true");
|
||||
props.setProperty("queryPlan.thresholdMicros", "10000");
|
||||
@@ -83,46 +85,48 @@ class DatabaseConfigTest {
|
||||
|
||||
config.loadFromProperties(props);
|
||||
|
||||
assertFalse(config.isDefaultServer());
|
||||
assertTrue(config.isDisableL2Cache());
|
||||
assertTrue(config.isNotifyL2CacheInForeground());
|
||||
assertTrue(config.isDbOffline());
|
||||
assertTrue(config.isAutoReadOnlyDataSource());
|
||||
assertTrue(config.isAutoLoadModuleInfo());
|
||||
assertTrue(config.isLoadModuleInfo());
|
||||
assertTrue(config.skipDataSourceCheck());
|
||||
var settings = config.settings();
|
||||
assertFalse(settings.isDefaultServer());
|
||||
assertTrue(settings.isDisableL2Cache());
|
||||
assertTrue(settings.isNotifyL2CacheInForeground());
|
||||
assertTrue(settings.isDbOffline());
|
||||
assertTrue(settings.isAutoReadOnlyDataSource());
|
||||
assertTrue(settings.isAutoLoadModuleInfo());
|
||||
assertTrue(settings.isLoadModuleInfo());
|
||||
assertTrue(settings.skipDataSourceCheck());
|
||||
assertTrue(settings.readOnlyDatabase());
|
||||
|
||||
assertTrue(config.isIdGeneratorAutomatic());
|
||||
assertFalse(config.getPlatformConfig().isCaseSensitiveCollation());
|
||||
assertTrue(config.getPlatformConfig().isForUpdateNoKey());
|
||||
assertTrue(settings.isIdGeneratorAutomatic());
|
||||
assertFalse(settings.getPlatformConfig().isCaseSensitiveCollation());
|
||||
assertTrue(settings.getPlatformConfig().isForUpdateNoKey());
|
||||
|
||||
assertThat(config.getNamingConvention()).isInstanceOf(MatchingNamingConvention.class);
|
||||
assertThat(settings.getNamingConvention()).isInstanceOf(MatchingNamingConvention.class);
|
||||
|
||||
assertEquals(MutationDetection.NONE, config.getJsonMutationDetection());
|
||||
assertEquals(MutationDetection.NONE, settings.getJsonMutationDetection());
|
||||
config.setJsonMutationDetection(MutationDetection.SOURCE);
|
||||
assertEquals(MutationDetection.SOURCE, config.getJsonMutationDetection());
|
||||
assertEquals(IdType.SEQUENCE, config.getIdType());
|
||||
assertEquals(PersistBatch.ALL, config.getPersistBatch());
|
||||
assertEquals(PersistBatch.ALL, config.getPersistBatchOnCascade());
|
||||
Assertions.assertEquals(PlatformConfig.DbUuid.BINARY, config.getPlatformConfig().getDbUuid());
|
||||
Assertions.assertEquals(JsonConfig.DateTime.MILLIS, config.getJsonDateTime());
|
||||
assertEquals(JsonConfig.Date.MILLIS, config.getJsonDate());
|
||||
assertEquals(MutationDetection.SOURCE, settings.getJsonMutationDetection());
|
||||
assertEquals(IdType.SEQUENCE, settings.getIdType());
|
||||
assertEquals(PersistBatch.ALL, settings.getPersistBatch());
|
||||
assertEquals(PersistBatch.ALL, settings.getPersistBatchOnCascade());
|
||||
Assertions.assertEquals(PlatformConfig.DbUuid.BINARY, settings.getPlatformConfig().getDbUuid());
|
||||
Assertions.assertEquals(JsonConfig.DateTime.MILLIS, settings.getJsonDateTime());
|
||||
assertEquals(JsonConfig.Date.MILLIS, settings.getJsonDate());
|
||||
|
||||
assertEquals("r0,users,orgs", config.getEnabledL2Regions());
|
||||
assertEquals("r0,users,orgs", settings.getEnabledL2Regions());
|
||||
|
||||
assertEquals(42, config.getJdbcFetchSizeFindEach());
|
||||
assertEquals(43, config.getJdbcFetchSizeFindList());
|
||||
assertEquals(4, config.getBackgroundExecutorSchedulePoolSize());
|
||||
assertEquals(98, config.getBackgroundExecutorShutdownSecs());
|
||||
assertEquals(42, settings.getJdbcFetchSizeFindEach());
|
||||
assertEquals(43, settings.getJdbcFetchSizeFindList());
|
||||
assertEquals(4, settings.getBackgroundExecutorSchedulePoolSize());
|
||||
assertEquals(98, settings.getBackgroundExecutorShutdownSecs());
|
||||
|
||||
assertTrue(config.isQueryPlanEnable());
|
||||
assertEquals(10000, config.getQueryPlanThresholdMicros());
|
||||
assertTrue(config.isQueryPlanCapture());
|
||||
assertEquals(42, config.getQueryPlanCapturePeriodSecs());
|
||||
assertEquals(560, config.getQueryPlanCaptureMaxTimeMillis());
|
||||
assertEquals(7, config.getQueryPlanCaptureMaxCount());
|
||||
assertTrue(settings.isQueryPlanEnable());
|
||||
assertEquals(10000, settings.getQueryPlanThresholdMicros());
|
||||
assertTrue(settings.isQueryPlanCapture());
|
||||
assertEquals(42, settings.getQueryPlanCapturePeriodSecs());
|
||||
assertEquals(560, settings.getQueryPlanCaptureMaxTimeMillis());
|
||||
assertEquals(7, settings.getQueryPlanCaptureMaxCount());
|
||||
|
||||
assertThat(config.getMappingLocations()).containsExactly("classpath:/foo","bar");
|
||||
assertThat(settings.getMappingLocations()).containsExactly("classpath:/foo","bar");
|
||||
|
||||
config.setPersistBatch(PersistBatch.NONE);
|
||||
config.setPersistBatchOnCascade(PersistBatch.NONE);
|
||||
@@ -137,19 +141,19 @@ class DatabaseConfigTest {
|
||||
props1.setProperty("ebean.notifyL2CacheInForeground", "false");
|
||||
|
||||
config.loadFromProperties(props1);
|
||||
assertFalse(config.isDisableL2Cache());
|
||||
assertFalse(config.isNotifyL2CacheInForeground());
|
||||
assertFalse(settings.isDisableL2Cache());
|
||||
assertFalse(settings.isNotifyL2CacheInForeground());
|
||||
|
||||
assertEquals(PersistBatch.ALL, config.getPersistBatch());
|
||||
assertEquals(PersistBatch.ALL, config.getPersistBatchOnCascade());
|
||||
assertEquals(PersistBatch.ALL, settings.getPersistBatch());
|
||||
assertEquals(PersistBatch.ALL, settings.getPersistBatchOnCascade());
|
||||
|
||||
config.setEnabledL2Regions("r0,orgs");
|
||||
assertEquals("r0,orgs", config.getEnabledL2Regions());
|
||||
assertEquals("r0,orgs", settings.getEnabledL2Regions());
|
||||
}
|
||||
|
||||
@Test
|
||||
void test_defaults() {
|
||||
DatabaseConfig config = new DatabaseConfig();
|
||||
DatabaseBuilder.Settings config = new DatabaseConfig().settings();
|
||||
assertTrue(config.isIdGeneratorAutomatic());
|
||||
assertTrue(config.isDefaultServer());
|
||||
assertFalse(config.isAutoPersistUpdates());
|
||||
@@ -184,7 +188,7 @@ class DatabaseConfigTest {
|
||||
void test_putServiceObject() {
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
DatabaseConfig config = new DatabaseConfig();
|
||||
var config = new DatabaseConfig().settings();
|
||||
config.putServiceObject(objectMapper);
|
||||
|
||||
ObjectMapper mapper0 = config.getServiceObject(ObjectMapper.class);
|
||||
|
||||
+38
-35
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</parent>
|
||||
|
||||
<name>ebean bom</name>
|
||||
@@ -89,49 +89,49 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core-type</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-joda-time</artifactId>
|
||||
<version>13.18.0</version>
|
||||
<version>13.24.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-jackson-jsonnode</artifactId>
|
||||
<version>13.18.0</version>
|
||||
<version>13.24.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-jackson-mapper</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-ddl-generator</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -155,46 +155,37 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-querybean</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>querybean-generator</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<scope>provided</scope>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>kotlin-querybean-generator</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<scope>provided</scope>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-test</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-postgis</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-redis</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-spring-txn</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<!-- platforms -->
|
||||
@@ -202,67 +193,79 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-clickhouse</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-db2</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-h2</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-hana</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-mariadb</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-mysql</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-nuodb</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-oracle</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-postgres</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-postgis</artifactId>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-postgis-types</artifactId>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-sqlite</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-sqlserver</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
+3
-10
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ebean-core-type</artifactId>
|
||||
@@ -16,7 +16,7 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -30,17 +30,10 @@
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>42.4.3</version>
|
||||
<version>42.6.0</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.avaje</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>1.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package io.ebean.core.type;
|
||||
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -12,5 +12,5 @@ public interface ExtraTypeFactory {
|
||||
/**
|
||||
* Provide extra types to Ebean.
|
||||
*/
|
||||
List<? extends ScalarType<?>> createTypes(DatabaseConfig config, Object objectMapper);
|
||||
List<? extends ScalarType<?>> createTypes(DatabaseBuilder.Settings config, Object objectMapper);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package io.ebean.core.type;
|
||||
|
||||
import io.avaje.lang.Nullable;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
/**
|
||||
* Factory to create ScalarTypeSet.
|
||||
@@ -12,6 +12,6 @@ public interface ScalarTypeSetFactory {
|
||||
* Create the ScalarTypeSet given the config and optional objectMapper.
|
||||
*/
|
||||
@Nullable
|
||||
ScalarTypeSet<?> createTypeSet(DatabaseConfig config, @Nullable Object objectMapper);
|
||||
ScalarTypeSet<?> createTypeSet(DatabaseBuilder.Settings config, @Nullable Object objectMapper);
|
||||
|
||||
}
|
||||
|
||||
+8
-15
@@ -3,7 +3,7 @@
|
||||
<parent>
|
||||
<artifactId>ebean-parent</artifactId>
|
||||
<groupId>io.ebean</groupId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>ebean-core</artifactId>
|
||||
@@ -22,7 +22,7 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-api</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -46,7 +46,7 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-core-type</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -58,7 +58,7 @@
|
||||
<dependency>
|
||||
<groupId>org.antlr</groupId>
|
||||
<artifactId>antlr4-runtime</artifactId>
|
||||
<version>4.8-1</version>
|
||||
<version>4.13.1</version>
|
||||
</dependency>
|
||||
|
||||
<!--
|
||||
@@ -151,7 +151,7 @@
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>42.5.1</version>
|
||||
<version>42.6.0</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
@@ -159,21 +159,21 @@
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-h2</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-postgres</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.ebean</groupId>
|
||||
<artifactId>ebean-platform-sqlserver</artifactId>
|
||||
<version>13.22.0</version>
|
||||
<version>13.26.1-jakarta</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
@@ -184,13 +184,6 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.avaje</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>1.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package io.ebeaninternal.api;
|
||||
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebeaninternal.server.type.GeoTypeBinder;
|
||||
|
||||
/**
|
||||
@@ -11,5 +11,5 @@ public interface GeoTypeProvider {
|
||||
/**
|
||||
* Create a binder for binding geometry types.
|
||||
*/
|
||||
GeoTypeBinder createBinder(DatabaseConfig config);
|
||||
GeoTypeBinder createBinder(DatabaseBuilder.Settings config);
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ public final class LoadBeanRequest extends LoadRequest {
|
||||
}
|
||||
|
||||
private String mode() {
|
||||
return lazy ? "+lazy" : loadBuffer.isCache() ? "+cache" : "+query";
|
||||
return lazy ? "lazy" : loadBuffer.isCache() ? "cache" : "query";
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -101,7 +101,7 @@ public final class LoadManyRequest extends LoadRequest {
|
||||
query.setLazyLoadForParents(many);
|
||||
many.addWhereParentIdIn(query, parentIdList(server), loadContext.isUseDocStore());
|
||||
query.setPersistenceContext(loadContext.persistenceContext());
|
||||
query.setLoadDescription(lazy ? "+lazy" : "+query", description());
|
||||
query.setLoadDescription(lazy ? "lazy" : "query", description());
|
||||
if (lazy) {
|
||||
query.setLazyLoadBatchSize(loadContext.batchSize());
|
||||
} else {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package io.ebeaninternal.api;
|
||||
|
||||
import io.avaje.lang.Nullable;
|
||||
import io.ebean.CacheMode;
|
||||
import io.ebean.CountDistinctOrder;
|
||||
import io.ebean.ExpressionList;
|
||||
@@ -339,7 +340,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
|
||||
/**
|
||||
* Set the on a secondary query given the label, relativePath and profile location of the parent query.
|
||||
*/
|
||||
void setProfilePath(String label, String relativePath, ProfileLocation profileLocation);
|
||||
void setProfilePath(String label, String relativePath, @Nullable ProfileLocation profileLocation);
|
||||
|
||||
/**
|
||||
* Set the query mode.
|
||||
@@ -653,6 +654,16 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
|
||||
*/
|
||||
ObjectGraphNode parentNode();
|
||||
|
||||
/**
|
||||
* Set that this is a future query that will execute in the background.
|
||||
*/
|
||||
void usingFuture();
|
||||
|
||||
/**
|
||||
* Return true if this is a future query.
|
||||
*/
|
||||
boolean isUsingFuture();
|
||||
|
||||
/**
|
||||
* Return false when this is a lazy load or refresh query for a bean.
|
||||
* <p>
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
package io.ebeaninternal.server.autotune;
|
||||
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebeaninternal.api.SpiEbeanServer;
|
||||
|
||||
public interface AutoTuneServiceProvider {
|
||||
|
||||
AutoTuneService create(SpiEbeanServer server, DatabaseConfig config);
|
||||
AutoTuneService create(SpiEbeanServer server, DatabaseBuilder config);
|
||||
}
|
||||
|
||||
+6
-6
@@ -4,7 +4,7 @@ import io.ebean.cache.QueryCacheEntryValidate;
|
||||
import io.ebean.cache.ServerCacheFactory;
|
||||
import io.ebean.cache.ServerCacheOptions;
|
||||
import io.ebean.config.CurrentTenantProvider;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebeaninternal.server.cluster.ClusterManager;
|
||||
|
||||
/**
|
||||
@@ -13,7 +13,7 @@ import io.ebeaninternal.server.cluster.ClusterManager;
|
||||
public final class CacheManagerOptions {
|
||||
|
||||
private final ClusterManager clusterManager;
|
||||
private final DatabaseConfig databaseConfig;
|
||||
private final DatabaseBuilder.Settings databaseBuilder;
|
||||
private final boolean localL2Caching;
|
||||
private CurrentTenantProvider currentTenantProvider;
|
||||
private QueryCacheEntryValidate queryCacheEntryValidate;
|
||||
@@ -24,15 +24,15 @@ public final class CacheManagerOptions {
|
||||
CacheManagerOptions() {
|
||||
this.localL2Caching = true;
|
||||
this.clusterManager = null;
|
||||
this.databaseConfig = null;
|
||||
this.databaseBuilder = null;
|
||||
this.cacheFactory = new DefaultServerCacheFactory();
|
||||
this.beanDefault = new ServerCacheOptions();
|
||||
this.queryDefault = new ServerCacheOptions();
|
||||
}
|
||||
|
||||
public CacheManagerOptions(ClusterManager clusterManager, DatabaseConfig config, boolean localL2Caching) {
|
||||
public CacheManagerOptions(ClusterManager clusterManager, DatabaseBuilder.Settings config, boolean localL2Caching) {
|
||||
this.clusterManager = clusterManager;
|
||||
this.databaseConfig = config;
|
||||
this.databaseBuilder = config;
|
||||
this.localL2Caching = localL2Caching;
|
||||
this.currentTenantProvider = config.getCurrentTenantProvider();
|
||||
}
|
||||
@@ -55,7 +55,7 @@ public final class CacheManagerOptions {
|
||||
}
|
||||
|
||||
public String getServerName() {
|
||||
return (databaseConfig == null) ? "db" : databaseConfig.getName();
|
||||
return (databaseBuilder == null) ? "db" : databaseBuilder.getName();
|
||||
}
|
||||
|
||||
public boolean isLocalL2Caching() {
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@ package io.ebeaninternal.server.cache;
|
||||
import io.ebean.BackgroundExecutor;
|
||||
import io.ebean.cache.ServerCacheFactory;
|
||||
import io.ebean.cache.ServerCachePlugin;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
/**
|
||||
* Default implementation of ServerCachePlugin.
|
||||
@@ -14,7 +14,7 @@ public final class DefaultServerCachePlugin implements ServerCachePlugin {
|
||||
* Creates the default ServerCacheFactory.
|
||||
*/
|
||||
@Override
|
||||
public ServerCacheFactory create(DatabaseConfig config, BackgroundExecutor executor) {
|
||||
public ServerCacheFactory create(DatabaseBuilder config, BackgroundExecutor executor) {
|
||||
return new DefaultServerCacheFactory(executor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import io.ebean.Database;
|
||||
import io.ebean.config.ContainerConfig;
|
||||
import io.ebeaninternal.server.transaction.RemoteTransactionEvent;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
@@ -20,38 +19,22 @@ public class ClusterManager implements ServerLookup {
|
||||
private static final System.Logger clusterLogger = AppLog.getLogger("io.ebean.Cluster");
|
||||
|
||||
private final ReentrantLock lock = new ReentrantLock();
|
||||
|
||||
private final ConcurrentHashMap<String, Database> serverMap = new ConcurrentHashMap<>();
|
||||
|
||||
private final Object monitor = new Object();
|
||||
|
||||
private final ClusterBroadcast broadcast;
|
||||
|
||||
private boolean started;
|
||||
|
||||
private boolean shutdown;
|
||||
|
||||
public ClusterManager(ContainerConfig config) {
|
||||
ClusterBroadcastFactory factory = createFactory();
|
||||
if (factory != null && config.isActive()) {
|
||||
broadcast = factory.create(this, config);
|
||||
if (config.isActive()) {
|
||||
ClusterBroadcastFactory factory = createFactory();
|
||||
broadcast = factory != null ? factory.create(this, config) : null;
|
||||
} else {
|
||||
broadcast = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the ClusterTransportFactory via ServiceLoader.
|
||||
*/
|
||||
private ClusterBroadcastFactory createFactory() {
|
||||
|
||||
ServiceLoader<ClusterBroadcastFactory> load = ServiceLoader.load(ClusterBroadcastFactory.class);
|
||||
ClusterBroadcastFactory factory = null;
|
||||
Iterator<ClusterBroadcastFactory> iterator = load.iterator();
|
||||
if (iterator.hasNext()) {
|
||||
factory = iterator.next();
|
||||
}
|
||||
return factory;
|
||||
return ServiceLoader.load(ClusterBroadcastFactory.class).findFirst().orElse(null);
|
||||
}
|
||||
|
||||
public void registerServer(Database server) {
|
||||
|
||||
@@ -2,7 +2,7 @@ package io.ebeaninternal.server.core;
|
||||
|
||||
import io.avaje.classpath.scanner.ClassPathScanner;
|
||||
import io.avaje.classpath.scanner.ClassPathScannerFactory;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -16,7 +16,7 @@ public class ClassPathScanners {
|
||||
/**
|
||||
* Return the list of ClassPathScanner services using DatabaseConfig service loader.
|
||||
*/
|
||||
public static List<ClassPathScanner> find(DatabaseConfig config) {
|
||||
public static List<ClassPathScanner> find(DatabaseBuilder.Settings config) {
|
||||
List<ClassPathScanner> scanners = new ArrayList<>();
|
||||
for (ClassPathScannerFactory factory : ServiceLoader.load(ClassPathScannerFactory.class)) {
|
||||
scanners.add(factory.createScanner(config.getClassLoadConfig().getClassLoader()));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package io.ebeaninternal.server.core;
|
||||
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.config.dbplatform.DatabasePlatform;
|
||||
import io.ebean.config.dbplatform.DatabasePlatformProvider;
|
||||
import io.ebeaninternal.api.CoreLog;
|
||||
@@ -37,7 +37,7 @@ public class DatabasePlatformFactory {
|
||||
/**
|
||||
* Create the appropriate database specific platform.
|
||||
*/
|
||||
public DatabasePlatform create(DatabaseConfig config) {
|
||||
public DatabasePlatform create(DatabaseBuilder.Settings config) {
|
||||
try {
|
||||
String offlinePlatform = DbOffline.getPlatform();
|
||||
if (offlinePlatform != null) {
|
||||
|
||||
@@ -82,9 +82,9 @@ final class DefaultBeanLoader {
|
||||
// populate a new collection
|
||||
BeanCollection<?> emptyCollection = many.createEmpty(parentBean);
|
||||
many.setValue(parentBean, emptyCollection);
|
||||
query.setLoadDescription("+refresh", null);
|
||||
query.setLoadDescription("refresh", null);
|
||||
} else {
|
||||
query.setLoadDescription("+lazy", null);
|
||||
query.setLoadDescription("lazy", null);
|
||||
}
|
||||
|
||||
query.select(parentDesc.idBinder().idSelect());
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package io.ebeaninternal.server.core;
|
||||
|
||||
import io.ebean.Database;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.config.*;
|
||||
import io.ebean.config.dbplatform.DatabasePlatform;
|
||||
import io.ebean.event.ShutdownManager;
|
||||
@@ -12,11 +14,13 @@ import io.ebeaninternal.server.cluster.ClusterManager;
|
||||
import io.ebeaninternal.server.core.bootup.BootupClassPathSearch;
|
||||
import io.ebeaninternal.server.core.bootup.BootupClasses;
|
||||
import io.ebeaninternal.server.executor.DefaultBackgroundExecutor;
|
||||
|
||||
import jakarta.persistence.PersistenceException;
|
||||
|
||||
import java.net.URL;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
@@ -32,12 +36,22 @@ public final class DefaultContainer implements SpiContainer {
|
||||
|
||||
private final ReentrantLock lock = new ReentrantLock();
|
||||
private final ClusterManager clusterManager;
|
||||
private final List<EntityClassRegister> entityClassRegisters;
|
||||
|
||||
public DefaultContainer(ContainerConfig containerConfig) {
|
||||
this.clusterManager = new ClusterManager(containerConfig);
|
||||
// register so that we can shutdown any Ebean wide
|
||||
// resources such as clustering
|
||||
ShutdownManager.registerContainer(this);
|
||||
entityClassRegisters = initEntityRegisters();
|
||||
}
|
||||
|
||||
private List<EntityClassRegister> initEntityRegisters() {
|
||||
var entityClassRegisters = new ArrayList<EntityClassRegister>();
|
||||
for (EntityClassRegister entityClassRegister : ServiceLoader.load(EntityClassRegister.class)) {
|
||||
entityClassRegisters.add(entityClassRegister);
|
||||
}
|
||||
return entityClassRegisters;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -51,13 +65,12 @@ public final class DefaultContainer implements SpiContainer {
|
||||
*/
|
||||
@Override
|
||||
public SpiEbeanServer createServer(String name) {
|
||||
DatabaseConfig config = new DatabaseConfig();
|
||||
config.setName(name);
|
||||
config.loadFromProperties();
|
||||
return createServer(config);
|
||||
var builder = Database.builder().name(name).loadFromProperties();
|
||||
return createServer(builder);
|
||||
}
|
||||
|
||||
private SpiBackgroundExecutor createBackgroundExecutor(DatabaseConfig config) {
|
||||
private SpiBackgroundExecutor createBackgroundExecutor(DatabaseBuilder builder) {
|
||||
var config = builder.settings();
|
||||
String namePrefix = "ebean-" + config.getName();
|
||||
int schedulePoolSize = config.getBackgroundExecutorSchedulePoolSize();
|
||||
int shutdownSecs = config.getBackgroundExecutorShutdownSecs();
|
||||
@@ -69,9 +82,10 @@ public final class DefaultContainer implements SpiContainer {
|
||||
* Create the implementation from the configuration.
|
||||
*/
|
||||
@Override
|
||||
public SpiEbeanServer createServer(DatabaseConfig config) {
|
||||
public SpiEbeanServer createServer(DatabaseBuilder builder) {
|
||||
lock.lock();
|
||||
try {
|
||||
var config = builder.settings();
|
||||
long start = System.currentTimeMillis();
|
||||
applyConfigServices(config);
|
||||
setNamingConvention(config);
|
||||
@@ -79,7 +93,7 @@ public final class DefaultContainer implements SpiContainer {
|
||||
|
||||
boolean online = true;
|
||||
if (config.isDocStoreOnly()) {
|
||||
config.setDatabasePlatform(new DatabasePlatform());
|
||||
config.databasePlatform(new DatabasePlatform());
|
||||
} else {
|
||||
TenantMode tenantMode = config.getTenantMode();
|
||||
if (TenantMode.DB != tenantMode) {
|
||||
@@ -115,7 +129,7 @@ public final class DefaultContainer implements SpiContainer {
|
||||
}
|
||||
}
|
||||
|
||||
private void applyConfigServices(DatabaseConfig config) {
|
||||
private void applyConfigServices(DatabaseBuilder.Settings config) {
|
||||
if (config.isDefaultServer()) {
|
||||
for (DatabaseConfigProvider configProvider : ServiceLoader.load(DatabaseConfigProvider.class)) {
|
||||
configProvider.apply(config);
|
||||
@@ -123,12 +137,10 @@ public final class DefaultContainer implements SpiContainer {
|
||||
}
|
||||
if (config.isLoadModuleInfo()) {
|
||||
// auto register entity classes
|
||||
boolean found = false;
|
||||
for (EntityClassRegister loader : ServiceLoader.load(EntityClassRegister.class)) {
|
||||
for (EntityClassRegister loader : entityClassRegisters) {
|
||||
config.addAll(loader.classesFor(config.getName(), config.isDefaultServer()));
|
||||
found = true;
|
||||
}
|
||||
if (!found) {
|
||||
if (entityClassRegisters.isEmpty()) {
|
||||
checkMissingModulePathProvides();
|
||||
}
|
||||
}
|
||||
@@ -158,7 +170,7 @@ public final class DefaultContainer implements SpiContainer {
|
||||
* Get the entities, scalarTypes, Listeners etc combining the class registered
|
||||
* ones with the already created instances.
|
||||
*/
|
||||
private BootupClasses bootupClasses(DatabaseConfig config) {
|
||||
private BootupClasses bootupClasses(DatabaseBuilder.Settings config) {
|
||||
BootupClasses bootup = bootupClasses1(config);
|
||||
bootup.addServerConfigStartup(config.getServerConfigStartupListeners());
|
||||
bootup.runServerConfigStartup(config);
|
||||
@@ -176,7 +188,7 @@ public final class DefaultContainer implements SpiContainer {
|
||||
/**
|
||||
* Get the class based entities, scalarTypes, Listeners etc.
|
||||
*/
|
||||
private BootupClasses bootupClasses1(DatabaseConfig config) {
|
||||
private BootupClasses bootupClasses1(DatabaseBuilder.Settings config) {
|
||||
Set<Class<?>> classes = config.classes();
|
||||
if (config.isDisableClasspathSearch() || (classes != null && !classes.isEmpty())) {
|
||||
// use classes we explicitly added via configuration
|
||||
@@ -188,16 +200,16 @@ public final class DefaultContainer implements SpiContainer {
|
||||
/**
|
||||
* Set the naming convention to underscore if it has not already been set.
|
||||
*/
|
||||
private void setNamingConvention(DatabaseConfig config) {
|
||||
private void setNamingConvention(DatabaseBuilder.Settings config) {
|
||||
if (config.getNamingConvention() == null) {
|
||||
config.setNamingConvention(new UnderscoreNamingConvention());
|
||||
config.namingConvention(new UnderscoreNamingConvention());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the DatabasePlatform if it has not already been set.
|
||||
*/
|
||||
private void setDatabasePlatform(DatabaseConfig config) {
|
||||
private void setDatabasePlatform(DatabaseBuilder.Settings config) {
|
||||
DatabasePlatform platform = config.getDatabasePlatform();
|
||||
if (platform == null) {
|
||||
if (config.getTenantMode().isDynamicDataSource()) {
|
||||
@@ -205,7 +217,7 @@ public final class DefaultContainer implements SpiContainer {
|
||||
}
|
||||
// automatically determine the platform
|
||||
platform = new DatabasePlatformFactory().create(config);
|
||||
config.setDatabasePlatform(platform);
|
||||
config.databasePlatform(platform);
|
||||
}
|
||||
platform.configure(config.getPlatformConfig());
|
||||
}
|
||||
@@ -213,7 +225,7 @@ public final class DefaultContainer implements SpiContainer {
|
||||
/**
|
||||
* Set the DataSource if it has not already been set.
|
||||
*/
|
||||
private void setDataSource(DatabaseConfig config) {
|
||||
private void setDataSource(DatabaseBuilder.Settings config) {
|
||||
if (isOfflineMode(config)) {
|
||||
log.log(DEBUG, "... DbOffline using platform [{0}]", DbOffline.getPlatform());
|
||||
} else {
|
||||
@@ -221,7 +233,7 @@ public final class DefaultContainer implements SpiContainer {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isOfflineMode(DatabaseConfig config) {
|
||||
private boolean isOfflineMode(DatabaseBuilder.Settings config) {
|
||||
return config.isDbOffline() || DbOffline.isSet();
|
||||
}
|
||||
|
||||
@@ -229,13 +241,11 @@ public final class DefaultContainer implements SpiContainer {
|
||||
* Check the autoCommit and Transaction Isolation levels of the DataSource.
|
||||
* <p>
|
||||
* If autoCommit is true this could be a real problem.
|
||||
* </p>
|
||||
* <p>
|
||||
* If the Isolation level is not READ_COMMITTED then optimistic concurrency
|
||||
* checking may not work as expected.
|
||||
* </p>
|
||||
*/
|
||||
private boolean checkDataSource(DatabaseConfig config) {
|
||||
private boolean checkDataSource(DatabaseBuilder.Settings config) {
|
||||
if (isOfflineMode(config)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
|
||||
private static final System.Logger log = CoreLog.internal;
|
||||
|
||||
private final ReentrantLock lock = new ReentrantLock();
|
||||
private final DatabaseConfig config;
|
||||
private final DatabaseBuilder.Settings config;
|
||||
private final String serverName;
|
||||
private final DatabasePlatform databasePlatform;
|
||||
private final TransactionManager transactionManager;
|
||||
@@ -170,7 +170,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
|
||||
/**
|
||||
* Create the CallStackFactory depending if AutoTune is being used.
|
||||
*/
|
||||
private CallOriginFactory initCallStackFactory(DatabaseConfig config) {
|
||||
private CallOriginFactory initCallStackFactory(DatabaseBuilder.Settings config) {
|
||||
if (!config.getAutoTuneConfig().isActive()) {
|
||||
// use a common CallStack for performance as we don't care with no AutoTune
|
||||
return new NoopCallOriginFactory();
|
||||
@@ -224,7 +224,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseConfig config() {
|
||||
public DatabaseBuilder.Settings config() {
|
||||
return config;
|
||||
}
|
||||
|
||||
@@ -961,7 +961,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
|
||||
}
|
||||
if (!query.isRawSql()) {
|
||||
query.setDefaultRawSqlIfRequired();
|
||||
if (query.isAutoTunable() && !autoTuneService.tuneQuery(query)) {
|
||||
if (!query.isAutoTunable() || !autoTuneService.tuneQuery(query)) {
|
||||
// use deployment FetchType.LAZY/EAGER annotations
|
||||
// to define the 'default' select clause
|
||||
query.setDefaultSelectClause();
|
||||
@@ -1273,6 +1273,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
|
||||
@Override
|
||||
public <T> FutureRowCount<T> findFutureCount(SpiQuery<T> query) {
|
||||
SpiQuery<T> copy = query.copy();
|
||||
copy.usingFuture();
|
||||
boolean createdTransaction = false;
|
||||
SpiTransaction transaction = query.transaction();
|
||||
if (transaction == null) {
|
||||
@@ -1291,6 +1292,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
|
||||
@Override
|
||||
public <T> FutureIds<T> findFutureIds(SpiQuery<T> query) {
|
||||
SpiQuery<T> copy = query.copy();
|
||||
copy.usingFuture();
|
||||
boolean createdTransaction = false;
|
||||
SpiTransaction transaction = query.transaction();
|
||||
if (transaction == null) {
|
||||
@@ -1309,6 +1311,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
|
||||
@Override
|
||||
public <T> FutureList<T> findFutureList(SpiQuery<T> query) {
|
||||
SpiQuery<T> spiQuery = query.copy();
|
||||
spiQuery.usingFuture();
|
||||
// FutureList query always run in it's own persistence content
|
||||
spiQuery.setPersistenceContext(new DefaultPersistenceContext());
|
||||
if (!spiQuery.isDisableReadAudit()) {
|
||||
@@ -1651,41 +1654,50 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
|
||||
}, transaction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert the bean.
|
||||
*/
|
||||
@Override
|
||||
public void insert(Object bean) {
|
||||
insert(bean, null);
|
||||
persister.insert(checkEntityBean(bean), null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insert(Object bean, @Nullable InsertOptions insertOptions) {
|
||||
persister.insert(checkEntityBean(bean), insertOptions, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert the bean with a transaction.
|
||||
*/
|
||||
@Override
|
||||
public void insert(Object bean, @Nullable Transaction transaction) {
|
||||
persister.insert(checkEntityBean(bean), transaction);
|
||||
persister.insert(checkEntityBean(bean), null, transaction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insert(Object bean, InsertOptions insertOptions, Transaction transaction) {
|
||||
persister.insert(checkEntityBean(bean), insertOptions, transaction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert all beans in the collection.
|
||||
*/
|
||||
@Override
|
||||
public void insertAll(Collection<?> beans) {
|
||||
insertAll(beans, null);
|
||||
insertAll(beans, null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertAll(Collection<?> beans, InsertOptions options) {
|
||||
insertAll(beans, options, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert all beans in the collection with a transaction.
|
||||
*/
|
||||
@Override
|
||||
public void insertAll(@Nullable Collection<?> beans, @Nullable Transaction transaction) {
|
||||
insertAll(beans, null, transaction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertAll(@Nullable Collection<?> beans, InsertOptions options, @Nullable Transaction transaction) {
|
||||
if (beans == null || beans.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
executeInTrans((txn) -> {
|
||||
txn.checkBatchEscalationOnCollection();
|
||||
for (Object bean : beans) {
|
||||
persister.insert(checkEntityBean(bean), txn);
|
||||
persister.insert(checkEntityBean(bean), options, txn);
|
||||
}
|
||||
return 0;
|
||||
}, transaction);
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
package io.ebeaninternal.server.core;
|
||||
|
||||
import io.ebean.annotation.Platform;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.datasource.DataSourceAlertFactory;
|
||||
import io.ebean.datasource.DataSourceConfig;
|
||||
import io.ebean.datasource.DataSourceFactory;
|
||||
import io.ebean.datasource.DataSourcePoolListener;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.datasource.*;
|
||||
|
||||
import jakarta.persistence.PersistenceException;
|
||||
import javax.sql.DataSource;
|
||||
@@ -15,16 +12,16 @@ import javax.sql.DataSource;
|
||||
*/
|
||||
final class InitDataSource {
|
||||
|
||||
private final DatabaseConfig config;
|
||||
private final DatabaseBuilder.Settings config;
|
||||
|
||||
/**
|
||||
* Create and set the main DataSource and read-only DataSource.
|
||||
*/
|
||||
static void init(DatabaseConfig config) {
|
||||
static void init(DatabaseBuilder.Settings config) {
|
||||
new InitDataSource(config).initialise();
|
||||
}
|
||||
|
||||
InitDataSource(DatabaseConfig config) {
|
||||
InitDataSource(DatabaseBuilder.Settings config) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
@@ -41,19 +38,23 @@ final class InitDataSource {
|
||||
* Initialise the "main" read write DataSource from configuration.
|
||||
*/
|
||||
private DataSource initDataSource() {
|
||||
return createFromConfig(config.getDataSourceConfig(), false);
|
||||
return createFromConfig(config.getDataSourceConfig(), config.readOnlyDatabase(), false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialise the "read only" DataSource from configuration.
|
||||
*/
|
||||
private DataSource initReadOnlyDataSource() {
|
||||
DataSourceConfig roConfig = readOnlyConfig();
|
||||
return roConfig == null ? null : createFromConfig(roConfig, true);
|
||||
if (config.readOnlyDatabase()) {
|
||||
// using the same DataSource instance
|
||||
return config.getDataSource();
|
||||
}
|
||||
var roConfig = readOnlyConfig();
|
||||
return roConfig == null ? null : createFromConfig(roConfig, false, true);
|
||||
}
|
||||
|
||||
DataSourceConfig readOnlyConfig() {
|
||||
DataSourceConfig roConfig = config.getReadOnlyDataSourceConfig();
|
||||
DataSourceBuilder.Settings readOnlyConfig() {
|
||||
var roConfig = config.getReadOnlyDataSourceConfig();
|
||||
if (roConfig == null) {
|
||||
// it has explicitly been set to null, not expected but ok
|
||||
return null;
|
||||
@@ -64,11 +65,11 @@ final class InitDataSource {
|
||||
// convenient alternate place to set the read-only url
|
||||
final String readOnlyUrl = config.getDataSourceConfig().getReadOnlyUrl();
|
||||
if (urlSet(readOnlyUrl)) {
|
||||
roConfig.setUrl(readOnlyUrl);
|
||||
roConfig.url(readOnlyUrl);
|
||||
return roConfig;
|
||||
}
|
||||
if (config.isAutoReadOnlyDataSource()) {
|
||||
roConfig.setUrl(null); // blank out in case it is "none"
|
||||
roConfig.url(null); // blank out in case it is "none"
|
||||
return roConfig;
|
||||
} else {
|
||||
return null;
|
||||
@@ -79,25 +80,27 @@ final class InitDataSource {
|
||||
return url != null && !"none".equalsIgnoreCase(url) && !url.trim().isEmpty();
|
||||
}
|
||||
|
||||
private DataSource createFromConfig(DataSourceConfig dsConfig, boolean readOnly) {
|
||||
private DataSource createFromConfig(DataSourceBuilder.Settings dsConfig, boolean readOnlyDB, boolean readOnly) {
|
||||
if (dsConfig == null) {
|
||||
throw new PersistenceException("No DataSourceConfig defined for " + config.getName());
|
||||
throw new PersistenceException("No DataSourceBuilder defined for " + config.getName());
|
||||
}
|
||||
if (dsConfig.isOffline()) {
|
||||
if (config.getDatabasePlatformName() == null) {
|
||||
throw new PersistenceException("You MUST specify a DatabasePlatformName on DatabaseConfig when offline");
|
||||
}
|
||||
if (dsConfig.isOffline() && config.getDatabasePlatformName() == null) {
|
||||
throw new PersistenceException("You MUST specify a DatabasePlatformName on DatabaseConfig when offline");
|
||||
}
|
||||
|
||||
attachAlert(dsConfig);
|
||||
attachListener(dsConfig);
|
||||
|
||||
if (readOnly) {
|
||||
if (readOnlyDB) {
|
||||
dsConfig.autoCommit(true);
|
||||
dsConfig.readOnly(true);
|
||||
} else if (readOnly) {
|
||||
// setup to use AutoCommit such that we skip explicit commit
|
||||
dsConfig.setAutoCommit(true);
|
||||
dsConfig.setReadOnly(true);
|
||||
dsConfig.setDefaults(config.getDataSourceConfig());
|
||||
dsConfig.setIsolationLevel(config.getDataSourceConfig().getIsolationLevel());
|
||||
var mainSettings = config.getDataSourceConfig();
|
||||
dsConfig.autoCommit(true);
|
||||
dsConfig.readOnly(true);
|
||||
dsConfig.setDefaults(mainSettings);
|
||||
dsConfig.isolationLevel(mainSettings.getIsolationLevel());
|
||||
} else if (isPostgresAllQuotedIdentifiers()) {
|
||||
dsConfig.addProperty("quoteReturningIdentifiers", false);
|
||||
}
|
||||
@@ -108,32 +111,32 @@ final class InitDataSource {
|
||||
return config.isAllQuotedIdentifiers() && Platform.POSTGRES == config.getDatabasePlatform().platform().base();
|
||||
}
|
||||
|
||||
private DataSource create(DataSourceConfig dsConfig, boolean readOnly) {
|
||||
private DataSource create(DataSourceBuilder dsConfig, boolean readOnly) {
|
||||
String poolName = config.getName() + (readOnly ? "-ro" : "");
|
||||
return DataSourceFactory.create(poolName, dsConfig);
|
||||
return dsConfig.name(poolName).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Attach DataSourceAlert via service loader if present.
|
||||
*/
|
||||
private void attachAlert(DataSourceConfig dsConfig) {
|
||||
private void attachAlert(DataSourceBuilder.Settings dsConfig) {
|
||||
DataSourceAlertFactory alertFactory = config.getServiceObject(DataSourceAlertFactory.class);
|
||||
if (alertFactory == null) {
|
||||
alertFactory = ServiceUtil.service(DataSourceAlertFactory.class);
|
||||
}
|
||||
if (alertFactory != null) {
|
||||
dsConfig.setAlert(alertFactory.createAlert());
|
||||
dsConfig.alert(alertFactory.createAlert());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create and attach a DataSourcePoolListener if it has been specified via properties and there is not one already attached.
|
||||
*/
|
||||
private void attachListener(DataSourceConfig dsConfig) {
|
||||
private void attachListener(DataSourceBuilder.Settings dsConfig) {
|
||||
if (dsConfig.getListener() == null) {
|
||||
String poolListener = dsConfig.getPoolListener();
|
||||
if (poolListener != null) {
|
||||
dsConfig.setListener((DataSourcePoolListener) config.getClassLoadConfig().newInstance(poolListener));
|
||||
dsConfig.listener((DataSourcePoolListener) config.getClassLoadConfig().newInstance(poolListener));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
package io.ebeaninternal.server.core;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonFactory;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.ExpressionFactory;
|
||||
import io.ebean.annotation.Platform;
|
||||
import io.ebean.cache.*;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.config.ExternalTransactionManager;
|
||||
import io.ebean.config.ProfilingConfig;
|
||||
import io.ebean.config.SlowQueryListener;
|
||||
import io.ebean.config.*;
|
||||
import io.ebean.config.dbplatform.DatabasePlatform;
|
||||
import io.ebean.config.dbplatform.DbHistorySupport;
|
||||
import io.ebean.event.changelog.ChangeLogListener;
|
||||
@@ -71,7 +69,7 @@ public final class InternalConfiguration {
|
||||
|
||||
private final TableModState tableModState;
|
||||
private final boolean online;
|
||||
private final DatabaseConfig config;
|
||||
private final DatabaseBuilder.Settings config;
|
||||
private final BootupClasses bootupClasses;
|
||||
private final DatabasePlatform databasePlatform;
|
||||
private final DeployInherit deployInherit;
|
||||
@@ -100,12 +98,12 @@ public final class InternalConfiguration {
|
||||
private boolean localL2Caching;
|
||||
|
||||
InternalConfiguration(boolean online, ClusterManager clusterManager, SpiBackgroundExecutor backgroundExecutor,
|
||||
DatabaseConfig config, BootupClasses bootupClasses) {
|
||||
DatabaseBuilder.Settings config, BootupClasses bootupClasses) {
|
||||
|
||||
this.online = online;
|
||||
this.config = config;
|
||||
this.jacksonCorePresent = config.getClassLoadConfig().isJacksonCorePresent();
|
||||
this.clockService = new ClockService(config.getClock());
|
||||
this.clockService = new ClockService(config.settings().getClock());
|
||||
this.tableModState = new TableModState();
|
||||
this.logManager = initLogManager();
|
||||
this.docStoreFactory = initDocStoreFactory(service(DocStoreFactory.class));
|
||||
@@ -175,7 +173,7 @@ public final class InternalConfiguration {
|
||||
/**
|
||||
* Create and return the ExpressionFactory based on configuration and database platform.
|
||||
*/
|
||||
private ExpressionFactory initExpressionFactory(DatabaseConfig config) {
|
||||
private ExpressionFactory initExpressionFactory(DatabaseBuilder.Settings config) {
|
||||
boolean nativeIlike = config.isExpressionNativeIlike() && databasePlatform.supportsNativeIlike();
|
||||
return new DefaultExpressionFactory(config.isExpressionEqualsWithNullAsNoop(), nativeIlike);
|
||||
}
|
||||
@@ -333,7 +331,7 @@ public final class InternalConfiguration {
|
||||
return config.getDatabasePlatform();
|
||||
}
|
||||
|
||||
public DatabaseConfig getConfig() {
|
||||
public DatabaseBuilder.Settings getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
@@ -590,14 +588,16 @@ public final class InternalConfiguration {
|
||||
*/
|
||||
QueryPlanLogger queryPlanLogger(Platform platform) {
|
||||
switch (platform.base()) {
|
||||
case POSTGRES:
|
||||
return new QueryPlanLoggerPostgres();
|
||||
case SQLSERVER:
|
||||
return new QueryPlanLoggerSqlServer();
|
||||
case ORACLE:
|
||||
return new QueryPlanLoggerOracle();
|
||||
case POSTGRES:
|
||||
return new QueryPlanLoggerExplain("explain (analyze, buffers) ");
|
||||
case YUGABYTE:
|
||||
return new QueryPlanLoggerExplain("explain (analyze, buffers, dist) ");
|
||||
default:
|
||||
return new QueryPlanLoggerExplain();
|
||||
return new QueryPlanLoggerExplain("explain ");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,6 @@ public final class OrmQueryRequest<T> extends BeanRequest implements SpiOrmQuery
|
||||
private final OrmQueryEngine queryEngine;
|
||||
private final SpiQuery<T> query;
|
||||
private final BeanFindController finder;
|
||||
private final Boolean readOnly;
|
||||
private LoadContext loadContext;
|
||||
private PersistenceContext persistenceContext;
|
||||
private HashQuery cacheKey;
|
||||
@@ -52,7 +51,6 @@ public final class OrmQueryRequest<T> extends BeanRequest implements SpiOrmQuery
|
||||
this.finder = beanDescriptor.beanFinder();
|
||||
this.queryEngine = queryEngine;
|
||||
this.query = query;
|
||||
this.readOnly = query.isReadOnly();
|
||||
this.persistenceContext = query.persistenceContext();
|
||||
}
|
||||
|
||||
@@ -135,13 +133,6 @@ public final class OrmQueryRequest<T> extends BeanRequest implements SpiOrmQuery
|
||||
return loadContext.secondaryQueriesMinBatchSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the Normal, sharedInstance, ReadOnly state of this query.
|
||||
*/
|
||||
public Boolean isReadOnly() {
|
||||
return readOnly;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the BeanDescriptor for the associated bean.
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package io.ebeaninternal.server.core;
|
||||
|
||||
import io.ebean.InsertOptions;
|
||||
import io.ebean.ValuePair;
|
||||
import io.ebean.annotation.DocStoreMode;
|
||||
import io.ebean.bean.EntityBean;
|
||||
@@ -124,6 +125,7 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
|
||||
* Many-to-many intersection table changes that are held for later batch processing.
|
||||
*/
|
||||
private List<SaveMany> saveMany;
|
||||
private InsertOptions insertOptions;
|
||||
|
||||
public PersistRequestBean(SpiEbeanServer server, T bean, Object parentBean, BeanManager<T> mgr, SpiTransaction t,
|
||||
PersistExecute persistExecute, PersistRequest.Type type, int flags) {
|
||||
@@ -380,6 +382,14 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
|
||||
return intercept.dirtyPropertyNames();
|
||||
}
|
||||
|
||||
public boolean isChangedProperty(int propertyIndex) {
|
||||
if (dirtyProperties == null) {
|
||||
return intercept.isChangedProperty(propertyIndex);
|
||||
} else {
|
||||
return dirtyProperties[propertyIndex];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the dirty properties on this request.
|
||||
*/
|
||||
@@ -865,8 +875,8 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
|
||||
}
|
||||
setNotifyCache();
|
||||
boolean isChangeLog = beanDescriptor.isChangeLog();
|
||||
if (type == Type.UPDATE && (isChangeLog || notifyCache || docStoreMode == DocStoreMode.UPDATE)) {
|
||||
// get the dirty properties for update notification to the doc store
|
||||
if (type == Type.UPDATE) {
|
||||
// get the dirty properties for notify cache & orphanRemoval of vanilla collection detection
|
||||
dirtyProperties = intercept.dirtyProperties();
|
||||
}
|
||||
if (isChangeLog) {
|
||||
@@ -1408,4 +1418,12 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
|
||||
private void setGeneratedId() {
|
||||
beanDescriptor.setGeneratedId(entityBean, transaction);
|
||||
}
|
||||
|
||||
public void setInsertOptions(InsertOptions insertOptions) {
|
||||
this.insertOptions = insertOptions;
|
||||
}
|
||||
|
||||
public InsertOptions insertOptions() {
|
||||
return insertOptions;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
package io.ebeaninternal.server.core;
|
||||
|
||||
import io.ebean.CallableSql;
|
||||
import io.ebean.MergeOptions;
|
||||
import io.ebean.Query;
|
||||
import io.ebean.SqlUpdate;
|
||||
import io.ebean.Transaction;
|
||||
import io.ebean.Update;
|
||||
import io.avaje.lang.Nullable;
|
||||
import io.ebean.*;
|
||||
import io.ebean.bean.EntityBean;
|
||||
import io.ebean.meta.MetricVisitor;
|
||||
import io.ebeaninternal.api.SpiSqlUpdate;
|
||||
@@ -31,9 +27,9 @@ public interface Persister {
|
||||
void update(EntityBean entityBean, Transaction t);
|
||||
|
||||
/**
|
||||
* Force an Insert using the given bean.
|
||||
* Perform an Insert using the given bean.
|
||||
*/
|
||||
void insert(EntityBean entityBean, Transaction t);
|
||||
void insert(EntityBean entityBean, @Nullable InsertOptions insertOptions, @Nullable Transaction t);
|
||||
|
||||
/**
|
||||
* Insert or update the bean depending on its state.
|
||||
@@ -44,7 +40,6 @@ public interface Persister {
|
||||
* Delete a bean given it's type and id value.
|
||||
* <p>
|
||||
* This will also cascade delete one level of children.
|
||||
* </p>
|
||||
*/
|
||||
int delete(Class<?> beanType, Object id, Transaction transaction, boolean permanent);
|
||||
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
package io.ebeaninternal.server.core.bootup;
|
||||
|
||||
import io.avaje.classpath.scanner.ClassPathScanner;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebeaninternal.api.CoreLog;
|
||||
import io.ebeaninternal.server.core.ClassPathScanners;
|
||||
|
||||
@@ -24,11 +24,11 @@ public class BootupClassPathSearch {
|
||||
* Search the classPath for the classes we are interested in returning
|
||||
* them as BootupClasses.
|
||||
*/
|
||||
public static BootupClasses search(DatabaseConfig config) {
|
||||
public static BootupClasses search(DatabaseBuilder.Settings config) {
|
||||
return new BootupClassPathSearch(config).getBootupClasses();
|
||||
}
|
||||
|
||||
private BootupClassPathSearch(DatabaseConfig config) {
|
||||
private BootupClassPathSearch(DatabaseBuilder.Settings config) {
|
||||
// find packages defined in ebean.mf resources
|
||||
Set<String> mfPackages = ManifestReader.create(config.getClassLoadConfig().getClassLoader())
|
||||
.read("META-INF/ebean.mf")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package io.ebeaninternal.server.core.bootup;
|
||||
|
||||
import io.ebean.annotation.DocStore;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.config.IdGenerator;
|
||||
import io.ebean.config.ScalarTypeConverter;
|
||||
import io.ebean.core.type.ScalarType;
|
||||
@@ -91,7 +91,7 @@ public class BootupClasses implements Predicate<Class<?>> {
|
||||
/**
|
||||
* Run any ServerConfigStartup listeners.
|
||||
*/
|
||||
public void runServerConfigStartup(DatabaseConfig config) {
|
||||
public void runServerConfigStartup(DatabaseBuilder config) {
|
||||
for (Class<?> cls : serverConfigStartupCandidates) {
|
||||
try {
|
||||
ServerConfigStartup newInstance = (ServerConfigStartup) cls.getDeclaredConstructor().newInstance();
|
||||
@@ -172,7 +172,7 @@ public class BootupClasses implements Predicate<Class<?>> {
|
||||
add(startupInstances, serverConfigStartupInstances, serverConfigStartupCandidates);
|
||||
}
|
||||
|
||||
public void addChangeLogInstances(DatabaseConfig config) {
|
||||
public void addChangeLogInstances(DatabaseBuilder.Settings config) {
|
||||
readAuditPrepare = config.getReadAuditPrepare();
|
||||
readAuditLogger = config.getReadAuditLogger();
|
||||
changeLogPrepare = config.getChangeLogPrepare();
|
||||
|
||||
@@ -4,7 +4,7 @@ import io.ebean.*;
|
||||
import io.ebean.annotation.DocStoreMode;
|
||||
import io.ebean.bean.*;
|
||||
import io.ebean.cache.QueryCacheEntry;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.config.EncryptKey;
|
||||
import io.ebean.config.dbplatform.IdType;
|
||||
import io.ebean.config.dbplatform.PlatformIdGenerator;
|
||||
@@ -237,7 +237,7 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType, SpiBeanType {
|
||||
this.owner = owner;
|
||||
this.multiValueSupported = owner.isMultiValueSupported();
|
||||
this.entityType = deploy.getEntityType();
|
||||
this.properties = deploy.getProperties();
|
||||
this.properties = deploy.propertyNames();
|
||||
this.name = InternString.intern(deploy.getName());
|
||||
this.baseTableAlias = "t0";
|
||||
this.fullName = InternString.intern(deploy.getFullName());
|
||||
@@ -278,7 +278,7 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType, SpiBeanType {
|
||||
this.partitionMeta = deploy.getPartitionMeta();
|
||||
this.tablespaceMeta = deploy.getTablespaceMeta();
|
||||
this.storageEngine = deploy.getStorageEngine();
|
||||
this.autoTunable = beanFinder == null && (entityType == EntityType.ORM || entityType == EntityType.VIEW);
|
||||
this.autoTunable = entityType == EntityType.ORM || entityType == EntityType.VIEW;
|
||||
// helper object used to derive lists of properties
|
||||
DeployBeanPropertyLists listHelper = new DeployBeanPropertyLists(owner, this, deploy);
|
||||
this.softDeleteProperty = listHelper.getSoftDeleteProperty();
|
||||
@@ -423,7 +423,7 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType, SpiBeanType {
|
||||
/**
|
||||
* Return the DatabaseConfig.
|
||||
*/
|
||||
public DatabaseConfig config() {
|
||||
public DatabaseBuilder.Settings config() {
|
||||
return owner.config();
|
||||
}
|
||||
|
||||
|
||||
+18
-19
@@ -1,6 +1,7 @@
|
||||
package io.ebeaninternal.server.deploy;
|
||||
|
||||
import io.ebean.BackgroundExecutor;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.Model;
|
||||
import io.ebean.RawSqlBuilder;
|
||||
import io.ebean.annotation.ConstraintMode;
|
||||
@@ -78,7 +79,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
|
||||
private final NamingConvention namingConvention;
|
||||
private final DeployCreateProperties createProperties;
|
||||
private final BeanManagerFactory beanManagerFactory;
|
||||
private final DatabaseConfig config;
|
||||
private final DatabaseBuilder.Settings config;
|
||||
private final ChangeLogListener changeLogListener;
|
||||
private final ChangeLogRegister changeLogRegister;
|
||||
private final ChangeLogPrepare changeLogPrepare;
|
||||
@@ -195,19 +196,19 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
|
||||
/**
|
||||
* Return the AsOfViewSuffix based on the DbHistorySupport.
|
||||
*/
|
||||
private String asOfViewSuffix(DatabasePlatform databasePlatform, DatabaseConfig serverConfig) {
|
||||
private String asOfViewSuffix(DatabasePlatform databasePlatform, DatabaseBuilder.Settings config) {
|
||||
DbHistorySupport historySupport = databasePlatform.historySupport();
|
||||
// with historySupport returns a simple view suffix or the sql2011 as of timestamp suffix
|
||||
return (historySupport == null) ? serverConfig.getAsOfViewSuffix() : historySupport.getAsOfViewSuffix(serverConfig.getAsOfViewSuffix());
|
||||
return (historySupport == null) ? config.getAsOfViewSuffix() : historySupport.getAsOfViewSuffix(config.getAsOfViewSuffix());
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the versions between timestamp suffix based on the DbHistorySupport.
|
||||
*/
|
||||
private String versionsBetweenSuffix(DatabasePlatform databasePlatform, DatabaseConfig serverConfig) {
|
||||
private String versionsBetweenSuffix(DatabasePlatform databasePlatform, DatabaseBuilder.Settings config) {
|
||||
DbHistorySupport historySupport = databasePlatform.historySupport();
|
||||
// with historySupport returns a simple view suffix or the sql2011 versions between timestamp suffix
|
||||
return (historySupport == null) ? serverConfig.getAsOfViewSuffix() : historySupport.getVersionsBetweenSuffix(serverConfig.getAsOfViewSuffix());
|
||||
return (historySupport == null) ? config.getAsOfViewSuffix() : historySupport.getVersionsBetweenSuffix(config.getAsOfViewSuffix());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -216,7 +217,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseConfig config() {
|
||||
public DatabaseBuilder.Settings config() {
|
||||
return config;
|
||||
}
|
||||
|
||||
@@ -443,11 +444,10 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
|
||||
// build map of tables to view entities dependent on those tables
|
||||
// for the purpose of invalidating appropriate query caches
|
||||
String[] dependentTables = desc.dependentTables();
|
||||
if (dependentTables != null && dependentTables.length > 0) {
|
||||
if (dependentTables != null) {
|
||||
for (String depTable : dependentTables) {
|
||||
depTable = depTable.toLowerCase();
|
||||
List<BeanDescriptor<?>> list = tableToViewDescMap.computeIfAbsent(depTable, k -> new ArrayList<>(1));
|
||||
list.add(desc);
|
||||
tableToViewDescMap.computeIfAbsent(depTable, k -> new ArrayList<>(1)).add(desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -578,7 +578,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
|
||||
}
|
||||
}
|
||||
|
||||
private <T> String errNothingRegistered() {
|
||||
private String errNothingRegistered() {
|
||||
return "There are no registered entities. If using query beans, that generates EbeanEntityRegister.java into " +
|
||||
"generated sources and is service loaded. If using module-info.java, then probably missing 'provides io.ebean.config.EntityClassRegister with EbeanEntityRegister' clause.";
|
||||
}
|
||||
@@ -1186,7 +1186,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
|
||||
setConcurrencyMode(desc);
|
||||
}
|
||||
// generate the byte code
|
||||
createByteCode(desc);
|
||||
setAccessors(desc);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1255,13 +1255,13 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
|
||||
return databasePlatform.createSequenceIdGenerator(backgroundExecutor, dataSource, stepSize, seqName);
|
||||
}
|
||||
|
||||
private void createByteCode(DeployBeanDescriptor<?> deploy) {
|
||||
private void setAccessors(DeployBeanDescriptor<?> deploy) {
|
||||
// check to see if the bean supports EntityBean interface
|
||||
// generate a subclass if required
|
||||
setEntityBeanClass(deploy);
|
||||
confirmEnhanced(deploy);
|
||||
// use Code generation or Standard reflection to support
|
||||
// getter and setter methods
|
||||
setBeanReflect(deploy);
|
||||
setPropertyAccessors(deploy);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1288,15 +1288,14 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
|
||||
* and getting of properties. It is generally faster to use code generation
|
||||
* rather than reflection to do this.
|
||||
*/
|
||||
private void setBeanReflect(DeployBeanDescriptor<?> desc) {
|
||||
private void setPropertyAccessors(DeployBeanDescriptor<?> desc) {
|
||||
// Set the BeanReflectGetter and BeanReflectSetter that typically
|
||||
// use generated code. NB: Due to Bug 166 so now doing this for
|
||||
// abstract classes as well.
|
||||
BeanPropertiesReader reflectProps = new BeanPropertiesReader(desc.getBeanType());
|
||||
desc.setProperties(reflectProps.getProperties());
|
||||
BeanPropertiesReader reflectProps = new BeanPropertiesReader(desc.propertyNames());
|
||||
for (DeployBeanProperty prop : desc.propertiesAll()) {
|
||||
String propName = prop.getName();
|
||||
Integer pos = reflectProps.getPropertyIndex(propName);
|
||||
Integer pos = reflectProps.propertyIndex(propName);
|
||||
if (pos == null) {
|
||||
if (isPersistentField(prop)) {
|
||||
throw new IllegalStateException(
|
||||
@@ -1368,7 +1367,7 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
|
||||
/**
|
||||
* Test the bean type to see if it implements EntityBean interface already.
|
||||
*/
|
||||
private void setEntityBeanClass(DeployBeanDescriptor<?> desc) {
|
||||
private void confirmEnhanced(DeployBeanDescriptor<?> desc) {
|
||||
Class<?> beanClass = desc.getBeanType();
|
||||
if (!hasEntityBeanInterface(beanClass)) {
|
||||
String msg = "Bean " + beanClass + " is not enhanced? Check packages specified in ebean.mf. If you are running in IDEA or " +
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package io.ebeaninternal.server.deploy;
|
||||
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.config.EncryptKey;
|
||||
import io.ebean.config.NamingConvention;
|
||||
import io.ebean.core.type.ScalarType;
|
||||
@@ -25,7 +25,7 @@ public interface BeanDescriptorMap {
|
||||
/**
|
||||
* Return the DatabaseConfig.
|
||||
*/
|
||||
DatabaseConfig config();
|
||||
DatabaseBuilder.Settings config();
|
||||
|
||||
/**
|
||||
* Return the Cache Manager.
|
||||
|
||||
+2
-2
@@ -2,7 +2,7 @@ package io.ebeaninternal.server.deploy;
|
||||
|
||||
import io.ebean.annotation.PostSoftDelete;
|
||||
import io.ebean.annotation.PreSoftDelete;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.event.BeanPersistAdapter;
|
||||
import io.ebean.event.BeanPersistRequest;
|
||||
import io.ebean.event.BeanPostConstructListener;
|
||||
@@ -34,7 +34,7 @@ final class BeanLifecycleAdapterFactory {
|
||||
|
||||
private final boolean postConstructPresent;
|
||||
|
||||
BeanLifecycleAdapterFactory(DatabaseConfig config) {
|
||||
BeanLifecycleAdapterFactory(DatabaseBuilder.Settings config) {
|
||||
this.postConstructPresent = config.getClassLoadConfig().isJavaxPostConstructPresent();
|
||||
}
|
||||
|
||||
|
||||
@@ -148,4 +148,10 @@ public interface DbSqlContext {
|
||||
* Add extra joins *IF* required to support inheritance discriminator in projection.
|
||||
*/
|
||||
void flushExtraJoins();
|
||||
|
||||
/**
|
||||
* Return true if the last join was added and false means the join was suppressed
|
||||
* as it was already added to the query.
|
||||
*/
|
||||
boolean joinAdded();
|
||||
}
|
||||
|
||||
+3
-5
@@ -1,10 +1,8 @@
|
||||
package io.ebeaninternal.server.deploy.generatedproperty;
|
||||
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.Transaction;
|
||||
import io.ebean.config.ClassLoadConfig;
|
||||
import io.ebean.config.CurrentUserProvider;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.config.IdGenerator;
|
||||
import io.ebean.config.*;
|
||||
import io.ebean.config.dbplatform.PlatformIdGenerator;
|
||||
import io.ebeaninternal.server.deploy.meta.DeployBeanProperty;
|
||||
|
||||
@@ -29,7 +27,7 @@ public final class GeneratedPropertyFactory {
|
||||
private final ClassLoadConfig classLoadConfig;
|
||||
private final Map<String, PlatformIdGenerator> idGeneratorMap = new HashMap<>();
|
||||
|
||||
public GeneratedPropertyFactory(boolean offlineMode, DatabaseConfig config, List<IdGenerator> idGenerators) {
|
||||
public GeneratedPropertyFactory(boolean offlineMode, DatabaseBuilder.Settings config, List<IdGenerator> idGenerators) {
|
||||
this.classLoadConfig = config.getClassLoadConfig();
|
||||
this.insertFactory = new InsertTimestampFactory(classLoadConfig);
|
||||
this.updateFactory = new UpdateTimestampFactory(classLoadConfig);
|
||||
|
||||
+26
-28
@@ -4,7 +4,7 @@ import io.ebean.annotation.Cache;
|
||||
import io.ebean.annotation.DocStore;
|
||||
import io.ebean.annotation.DocStoreMode;
|
||||
import io.ebean.annotation.Identity;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.config.TableName;
|
||||
import io.ebean.config.dbplatform.IdType;
|
||||
import io.ebean.config.dbplatform.PlatformIdGenerator;
|
||||
@@ -24,6 +24,8 @@ import io.ebeaninternal.server.rawsql.SpiRawSql;
|
||||
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.MappedSuperclass;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
@@ -45,9 +47,7 @@ public class DeployBeanDescriptor<T> {
|
||||
|
||||
private static final PropOrder PROP_ORDER = new PropOrder();
|
||||
|
||||
private static final String I_SCALAOBJECT = "scala.ScalaObject";
|
||||
|
||||
private final DatabaseConfig config;
|
||||
private final DatabaseBuilder.Settings config;
|
||||
private final BeanDescriptorManager manager;
|
||||
/**
|
||||
* Map of BeanProperty Linked so as to preserve order.
|
||||
@@ -133,16 +133,36 @@ public class DeployBeanDescriptor<T> {
|
||||
/**
|
||||
* Construct the BeanDescriptor.
|
||||
*/
|
||||
public DeployBeanDescriptor(BeanDescriptorManager manager, Class<T> beanType, DatabaseConfig config) {
|
||||
public DeployBeanDescriptor(BeanDescriptorManager manager, Class<T> beanType, DatabaseBuilder.Settings config) {
|
||||
this.manager = manager;
|
||||
this.config = config;
|
||||
this.beanType = beanType;
|
||||
}
|
||||
|
||||
private String[] readPropertyNames() {
|
||||
try {
|
||||
Field field = beanType.getField("_ebean_props");
|
||||
return (String[]) field.get(null);
|
||||
} catch (Exception e) {
|
||||
throw new IllegalStateException("Error getting _ebean_props field on type " + beanType, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void setPropertyNames(String[] properties) {
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
public String[] propertyNames() {
|
||||
if (properties == null) {
|
||||
properties = readPropertyNames();
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the IdClass to use.
|
||||
*/
|
||||
public void setIdClass(Class idClass) {
|
||||
public void setIdClass(Class<?> idClass) {
|
||||
this.idClass = idClass;
|
||||
}
|
||||
|
||||
@@ -260,7 +280,6 @@ public class DeployBeanDescriptor<T> {
|
||||
* Read the top level doc store deployment information.
|
||||
*/
|
||||
public void readDocStore(DocStore docStore) {
|
||||
|
||||
this.docStore = docStore;
|
||||
docStoreMapped = true;
|
||||
docStoreQueueId = docStore.queueId();
|
||||
@@ -276,23 +295,10 @@ public class DeployBeanDescriptor<T> {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isScalaObject() {
|
||||
Class<?>[] interfaces = beanType.getInterfaces();
|
||||
for (Class<?> anInterface : interfaces) {
|
||||
String iname = anInterface.getName();
|
||||
if (I_SCALAOBJECT.equals(iname)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public DeployBeanTable createDeployBeanTable() {
|
||||
|
||||
DeployBeanTable beanTable = new DeployBeanTable(getBeanType());
|
||||
beanTable.setBaseTable(baseTable);
|
||||
beanTable.setIdProperty(idProperty());
|
||||
|
||||
return beanTable;
|
||||
}
|
||||
|
||||
@@ -360,14 +366,6 @@ public class DeployBeanDescriptor<T> {
|
||||
this.identityMode.setIdType(type);
|
||||
}
|
||||
|
||||
public String[] getProperties() {
|
||||
return properties;
|
||||
}
|
||||
|
||||
public void setProperties(String[] props) {
|
||||
this.properties = props;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the class type this BeanDescriptor describes.
|
||||
*/
|
||||
|
||||
+2
-2
@@ -213,9 +213,9 @@ final class AnnotationAssocManys extends AnnotationAssoc {
|
||||
|
||||
int sortOrder = 0;
|
||||
if (!prop.getManyType().isMap()) {
|
||||
elementDescriptor.setProperties(new String[]{"value"});
|
||||
elementDescriptor.setPropertyNames(new String[]{"value"});
|
||||
} else {
|
||||
elementDescriptor.setProperties(new String[]{"key", "value"});
|
||||
elementDescriptor.setPropertyNames(new String[]{"key", "value"});
|
||||
String dbKeyColumn = "mkey";
|
||||
MapKeyColumn mapKeyColumn = get(prop, MapKeyColumn.class);
|
||||
if (mapKeyColumn != null) {
|
||||
|
||||
@@ -99,6 +99,10 @@ final class AnnotationFields extends AnnotationParser {
|
||||
if (formula != null) {
|
||||
prop.setSqlFormula(processFormula(formula.select()), processFormula(formula.join()));
|
||||
}
|
||||
DbComment comment = get(prop, DbComment.class);
|
||||
if (comment != null) {
|
||||
prop.setDbComment(comment.value());
|
||||
}
|
||||
initWhoProperties(prop);
|
||||
initDbMigration(prop);
|
||||
}
|
||||
|
||||
@@ -1,13 +1,8 @@
|
||||
package io.ebeaninternal.server.deploy.parse;
|
||||
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebean.annotation.*;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.config.EncryptDeploy;
|
||||
import io.ebean.config.EncryptDeployManager;
|
||||
import io.ebean.config.EncryptKeyManager;
|
||||
import io.ebean.config.Encryptor;
|
||||
import io.ebean.config.NamingConvention;
|
||||
import io.ebean.config.TableName;
|
||||
import io.ebean.config.*;
|
||||
import io.ebean.config.dbplatform.DatabasePlatform;
|
||||
import io.ebean.config.dbplatform.DbPlatformType;
|
||||
import io.ebean.core.type.ScalarType;
|
||||
@@ -49,7 +44,7 @@ public final class DeployUtil {
|
||||
private final Encryptor bytesEncryptor;
|
||||
private final boolean useValidationNotNull;
|
||||
|
||||
public DeployUtil(TypeManager typeMgr, DatabaseConfig config) {
|
||||
public DeployUtil(TypeManager typeMgr, DatabaseBuilder.Settings config) {
|
||||
this.typeManager = typeMgr;
|
||||
this.namingConvention = config.getNamingConvention();
|
||||
this.dbPlatform = config.getDatabasePlatform();
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@ import io.ebean.annotation.Aggregation;
|
||||
import io.ebean.annotation.Formula;
|
||||
import io.ebean.annotation.Where;
|
||||
import io.ebean.config.ClassLoadConfig;
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebeaninternal.server.deploy.generatedproperty.GeneratedPropertyFactory;
|
||||
import io.ebeaninternal.server.deploy.meta.DeployBeanProperty;
|
||||
|
||||
@@ -31,7 +31,7 @@ final class ReadAnnotationConfig {
|
||||
private final ReadValidationAnnotations jakartaValidation;
|
||||
private final Set<Class<?>> metaAnnotations = new HashSet<>();
|
||||
|
||||
ReadAnnotationConfig(GeneratedPropertyFactory generatedPropFactory, String asOfViewSuffix, String versionsBetweenSuffix, DatabaseConfig config) {
|
||||
ReadAnnotationConfig(GeneratedPropertyFactory generatedPropFactory, String asOfViewSuffix, String versionsBetweenSuffix, DatabaseBuilder.Settings config) {
|
||||
this.generatedPropFactory = generatedPropFactory;
|
||||
this.asOfViewSuffix = asOfViewSuffix;
|
||||
this.versionsBetweenSuffix = versionsBetweenSuffix;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package io.ebeaninternal.server.deploy.parse;
|
||||
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.DatabaseBuilder;
|
||||
import io.ebeaninternal.server.deploy.BeanDescriptorManager;
|
||||
import io.ebeaninternal.server.deploy.generatedproperty.GeneratedPropertyFactory;
|
||||
|
||||
@@ -12,7 +12,7 @@ public final class ReadAnnotations {
|
||||
|
||||
private final ReadAnnotationConfig readConfig;
|
||||
|
||||
public ReadAnnotations(GeneratedPropertyFactory generatedPropFactory, String asOfViewSuffix, String versionsBetweenSuffix, DatabaseConfig config) {
|
||||
public ReadAnnotations(GeneratedPropertyFactory generatedPropFactory, String asOfViewSuffix, String versionsBetweenSuffix, DatabaseBuilder.Settings config) {
|
||||
this.readConfig = new ReadAnnotationConfig(generatedPropFactory, asOfViewSuffix, versionsBetweenSuffix, config);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -81,7 +81,7 @@ final class BetweenPropertyExpression extends NonPrepareExpression {
|
||||
|
||||
@Override
|
||||
public void addSql(SpiExpressionRequest request) {
|
||||
request.append(" ?").append(BETWEEN).property(name(lowProperty)).append(" and ").property(name(highProperty));
|
||||
request.append("?").append(BETWEEN).property(name(lowProperty)).append(" and ").property(name(highProperty));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
||||
// Generated from /home/rob/github/ebean-dir/ebean/src/test/resources/EQL.g4 by ANTLR 4.8
|
||||
// Generated from /Users/robinbygrave/Documents/github/ebean/ebean/ebean-test/src/test/resources/EQL.g4 by ANTLR 4.13.1
|
||||
package io.ebeaninternal.server.grammer.antlr;
|
||||
|
||||
import org.antlr.v4.runtime.ParserRuleContext;
|
||||
@@ -10,6 +10,7 @@ import org.antlr.v4.runtime.tree.TerminalNode;
|
||||
* which can be extended to create a listener which only needs to handle a subset
|
||||
* of the available methods.
|
||||
*/
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public class EQLBaseListener implements EQLListener {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Generated from /home/rob/github/ebean-dir/ebean/src/test/resources/EQL.g4 by ANTLR 4.8
|
||||
// Generated from /Users/robinbygrave/Documents/github/ebean/ebean/ebean-test/src/test/resources/EQL.g4 by ANTLR 4.13.1
|
||||
package io.ebeaninternal.server.grammer.antlr;
|
||||
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
|
||||
* @param <T> The return type of the visit operation. Use {@link Void} for
|
||||
* operations with no return type.
|
||||
*/
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public class EQLBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements EQLVisitor<T> {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,36 +1,33 @@
|
||||
// Generated from /home/rob/github/ebean-dir/ebean/src/test/resources/EQL.g4 by ANTLR 4.8
|
||||
// Generated from /Users/robinbygrave/Documents/github/ebean/ebean/ebean-test/src/test/resources/EQL.g4 by ANTLR 4.13.1
|
||||
package io.ebeaninternal.server.grammer.antlr;
|
||||
|
||||
import org.antlr.v4.runtime.CharStream;
|
||||
import org.antlr.v4.runtime.Lexer;
|
||||
import org.antlr.v4.runtime.RuntimeMetaData;
|
||||
import org.antlr.v4.runtime.Vocabulary;
|
||||
import org.antlr.v4.runtime.VocabularyImpl;
|
||||
import org.antlr.v4.runtime.atn.ATN;
|
||||
import org.antlr.v4.runtime.atn.ATNDeserializer;
|
||||
import org.antlr.v4.runtime.atn.LexerATNSimulator;
|
||||
import org.antlr.v4.runtime.atn.PredictionContextCache;
|
||||
import org.antlr.v4.runtime.CharStream;
|
||||
import org.antlr.v4.runtime.Token;
|
||||
import org.antlr.v4.runtime.TokenStream;
|
||||
import org.antlr.v4.runtime.*;
|
||||
import org.antlr.v4.runtime.atn.*;
|
||||
import org.antlr.v4.runtime.dfa.DFA;
|
||||
import org.antlr.v4.runtime.misc.*;
|
||||
|
||||
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
|
||||
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"})
|
||||
public class EQLLexer extends Lexer {
|
||||
static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); }
|
||||
static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); }
|
||||
|
||||
protected static final DFA[] _decisionToDFA;
|
||||
protected static final PredictionContextCache _sharedContextCache =
|
||||
new PredictionContextCache();
|
||||
public static final int
|
||||
T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
|
||||
T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
|
||||
T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
|
||||
T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
|
||||
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
|
||||
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
|
||||
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
|
||||
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
|
||||
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
|
||||
T__66=67, INPUT_VARIABLE=68, PATH_VARIABLE=69, QUOTED_PATH_VARIABLE=70,
|
||||
PROP_FORMULA=71, BOOLEAN_LITERAL=72, NUMBER_LITERAL=73, DOUBLE=74, INT=75,
|
||||
T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
|
||||
T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
|
||||
T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
|
||||
T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
|
||||
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
|
||||
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
|
||||
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
|
||||
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
|
||||
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
|
||||
T__66=67, INPUT_VARIABLE=68, PATH_VARIABLE=69, QUOTED_PATH_VARIABLE=70,
|
||||
PROP_FORMULA=71, BOOLEAN_LITERAL=72, NUMBER_LITERAL=73, DOUBLE=74, INT=75,
|
||||
ZERO=76, STRING_LITERAL=77, WS=78;
|
||||
public static String[] channelNames = {
|
||||
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
|
||||
@@ -42,16 +39,16 @@ public class EQLLexer extends Lexer {
|
||||
|
||||
private static String[] makeRuleNames() {
|
||||
return new String[] {
|
||||
"T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8",
|
||||
"T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16",
|
||||
"T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24",
|
||||
"T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32",
|
||||
"T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40",
|
||||
"T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48",
|
||||
"T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56",
|
||||
"T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64",
|
||||
"T__65", "T__66", "INPUT_VARIABLE", "PATH_VARIABLE", "QUOTED_PATH_VARIABLE",
|
||||
"PROP_FORMULA", "BOOLEAN_LITERAL", "NUMBER_LITERAL", "DOUBLE", "INT",
|
||||
"T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8",
|
||||
"T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16",
|
||||
"T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24",
|
||||
"T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32",
|
||||
"T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40",
|
||||
"T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48",
|
||||
"T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56",
|
||||
"T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64",
|
||||
"T__65", "T__66", "INPUT_VARIABLE", "PATH_VARIABLE", "QUOTED_PATH_VARIABLE",
|
||||
"PROP_FORMULA", "BOOLEAN_LITERAL", "NUMBER_LITERAL", "DOUBLE", "INT",
|
||||
"ZERO", "STRING_LITERAL", "WS"
|
||||
};
|
||||
}
|
||||
@@ -59,29 +56,29 @@ public class EQLLexer extends Lexer {
|
||||
|
||||
private static String[] makeLiteralNames() {
|
||||
return new String[] {
|
||||
null, "'('", "')'", "'select'", "'distinct'", "'where'", "'order'", "'by'",
|
||||
"','", "'nulls'", "'first'", "'last'", "'asc'", "'desc'", "'limit'",
|
||||
"'offset'", "'fetch'", "'+'", "'query'", "'lazy'", "'or'", "'and'", "'not'",
|
||||
"'inOrEmpty'", "'in'", "'between'", "'to'", "'inrange'", "'inRange'",
|
||||
"'is'", "'null'", "'isNull'", "'isNotNull'", "'notNull'", "'empty'",
|
||||
"'isEmpty'", "'isNotEmpty'", "'notEmpty'", "'like'", "'ilike'", "'contains'",
|
||||
"'icontains'", "'startsWith'", "'istartsWith'", "'endsWith'", "'iendsWith'",
|
||||
"'='", "'eq'", "'>'", "'gt'", "'>='", "'ge'", "'gte'", "'<'", "'lt'",
|
||||
"'<='", "'le'", "'lte'", "'<>'", "'!='", "'ne'", "'ieq'", "'ine'", "'eqOrNull'",
|
||||
"'gtOrNull'", "'ltOrNull'", "'geOrNull'", "'leOrNull'", null, null, null,
|
||||
null, "'('", "')'", "'select'", "'distinct'", "'where'", "'order'", "'by'",
|
||||
"','", "'nulls'", "'first'", "'last'", "'asc'", "'desc'", "'limit'",
|
||||
"'offset'", "'fetch'", "'+'", "'query'", "'lazy'", "'or'", "'and'", "'not'",
|
||||
"'inOrEmpty'", "'in'", "'between'", "'to'", "'inrange'", "'inRange'",
|
||||
"'is'", "'null'", "'isNull'", "'isNotNull'", "'notNull'", "'empty'",
|
||||
"'isEmpty'", "'isNotEmpty'", "'notEmpty'", "'like'", "'ilike'", "'contains'",
|
||||
"'icontains'", "'startsWith'", "'istartsWith'", "'endsWith'", "'iendsWith'",
|
||||
"'='", "'eq'", "'>'", "'gt'", "'>='", "'ge'", "'gte'", "'<'", "'lt'",
|
||||
"'<='", "'le'", "'lte'", "'<>'", "'!='", "'ne'", "'ieq'", "'ine'", "'eqOrNull'",
|
||||
"'gtOrNull'", "'ltOrNull'", "'geOrNull'", "'leOrNull'", null, null, null,
|
||||
null, null, null, null, null, "'0'"
|
||||
};
|
||||
}
|
||||
private static final String[] _LITERAL_NAMES = makeLiteralNames();
|
||||
private static String[] makeSymbolicNames() {
|
||||
return new String[] {
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, "INPUT_VARIABLE", "PATH_VARIABLE",
|
||||
"QUOTED_PATH_VARIABLE", "PROP_FORMULA", "BOOLEAN_LITERAL", "NUMBER_LITERAL",
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, "INPUT_VARIABLE", "PATH_VARIABLE",
|
||||
"QUOTED_PATH_VARIABLE", "PROP_FORMULA", "BOOLEAN_LITERAL", "NUMBER_LITERAL",
|
||||
"DOUBLE", "INT", "ZERO", "STRING_LITERAL", "WS"
|
||||
};
|
||||
}
|
||||
@@ -144,225 +141,403 @@ public class EQLLexer extends Lexer {
|
||||
public ATN getATN() { return _ATN; }
|
||||
|
||||
public static final String _serializedATN =
|
||||
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2P\u029f\b\1\4\2\t"+
|
||||
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
|
||||
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
|
||||
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
|
||||
"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
|
||||
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
|
||||
",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
|
||||
"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
|
||||
"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
|
||||
"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3"+
|
||||
"\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6"+
|
||||
"\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3"+
|
||||
"\n\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3"+
|
||||
"\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3"+
|
||||
"\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\23\3\23\3"+
|
||||
"\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\26\3\26\3"+
|
||||
"\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3"+
|
||||
"\30\3\30\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3"+
|
||||
"\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3"+
|
||||
"\35\3\35\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3"+
|
||||
" \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3"+
|
||||
"\"\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3%\3%\3"+
|
||||
"%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3("+
|
||||
"\3(\3)\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+"+
|
||||
"\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-"+
|
||||
"\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3.\3.\3.\3/\3/\3\60\3\60\3\60"+
|
||||
"\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65"+
|
||||
"\3\65\3\66\3\66\3\67\3\67\3\67\38\38\38\39\39\39\3:\3:\3:\3:\3;\3;\3;"+
|
||||
"\3<\3<\3<\3=\3=\3=\3>\3>\3>\3>\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@"+
|
||||
"\3A\3A\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C"+
|
||||
"\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\7E\u0221\nE\fE\16E\u0224"+
|
||||
"\13E\3E\3E\7E\u0228\nE\fE\16E\u022b\13E\5E\u022d\nE\3F\3F\7F\u0231\nF"+
|
||||
"\fF\16F\u0234\13F\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
|
||||
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
|
||||
"H\3H\3H\3H\3H\3H\5H\u0264\nH\3I\3I\3I\3I\3I\3I\3I\3I\3I\5I\u026f\nI\3"+
|
||||
"J\5J\u0272\nJ\3J\3J\5J\u0276\nJ\3J\3J\5J\u027a\nJ\3K\6K\u027d\nK\rK\16"+
|
||||
"K\u027e\3K\3K\7K\u0283\nK\fK\16K\u0286\13K\3L\3L\7L\u028a\nL\fL\16L\u028d"+
|
||||
"\13L\3M\3M\3N\3N\3N\3N\7N\u0295\nN\fN\16N\u0298\13N\3N\3N\3O\3O\3O\3O"+
|
||||
"\2\2P\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35"+
|
||||
"\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36"+
|
||||
";\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67"+
|
||||
"m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d"+
|
||||
"H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\3\2\t\5\2C\\"+
|
||||
"aac|\6\2\62;C\\aac|\7\2\60\60\62;C\\aac|\3\2\62;\3\2\63;\3\2))\5\2\13"+
|
||||
"\f\17\17\"\"\2\u02b0\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2"+
|
||||
"\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3"+
|
||||
"\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2"+
|
||||
"\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2"+
|
||||
"\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2"+
|
||||
"\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2"+
|
||||
"\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q"+
|
||||
"\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2"+
|
||||
"\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2"+
|
||||
"\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w"+
|
||||
"\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2"+
|
||||
"\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+
|
||||
"\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2"+
|
||||
"\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d"+
|
||||
"\3\2\2\2\3\u009f\3\2\2\2\5\u00a1\3\2\2\2\7\u00a3\3\2\2\2\t\u00aa\3\2\2"+
|
||||
"\2\13\u00b3\3\2\2\2\r\u00b9\3\2\2\2\17\u00bf\3\2\2\2\21\u00c2\3\2\2\2"+
|
||||
"\23\u00c4\3\2\2\2\25\u00ca\3\2\2\2\27\u00d0\3\2\2\2\31\u00d5\3\2\2\2\33"+
|
||||
"\u00d9\3\2\2\2\35\u00de\3\2\2\2\37\u00e4\3\2\2\2!\u00eb\3\2\2\2#\u00f1"+
|
||||
"\3\2\2\2%\u00f3\3\2\2\2\'\u00f9\3\2\2\2)\u00fe\3\2\2\2+\u0101\3\2\2\2"+
|
||||
"-\u0105\3\2\2\2/\u0109\3\2\2\2\61\u0113\3\2\2\2\63\u0116\3\2\2\2\65\u011e"+
|
||||
"\3\2\2\2\67\u0121\3\2\2\29\u0129\3\2\2\2;\u0131\3\2\2\2=\u0134\3\2\2\2"+
|
||||
"?\u0139\3\2\2\2A\u0140\3\2\2\2C\u014a\3\2\2\2E\u0152\3\2\2\2G\u0158\3"+
|
||||
"\2\2\2I\u0160\3\2\2\2K\u016b\3\2\2\2M\u0174\3\2\2\2O\u0179\3\2\2\2Q\u017f"+
|
||||
"\3\2\2\2S\u0188\3\2\2\2U\u0192\3\2\2\2W\u019d\3\2\2\2Y\u01a9\3\2\2\2["+
|
||||
"\u01b2\3\2\2\2]\u01bc\3\2\2\2_\u01be\3\2\2\2a\u01c1\3\2\2\2c\u01c3\3\2"+
|
||||
"\2\2e\u01c6\3\2\2\2g\u01c9\3\2\2\2i\u01cc\3\2\2\2k\u01d0\3\2\2\2m\u01d2"+
|
||||
"\3\2\2\2o\u01d5\3\2\2\2q\u01d8\3\2\2\2s\u01db\3\2\2\2u\u01df\3\2\2\2w"+
|
||||
"\u01e2\3\2\2\2y\u01e5\3\2\2\2{\u01e8\3\2\2\2}\u01ec\3\2\2\2\177\u01f0"+
|
||||
"\3\2\2\2\u0081\u01f9\3\2\2\2\u0083\u0202\3\2\2\2\u0085\u020b\3\2\2\2\u0087"+
|
||||
"\u0214\3\2\2\2\u0089\u022c\3\2\2\2\u008b\u022e\3\2\2\2\u008d\u0235\3\2"+
|
||||
"\2\2\u008f\u0263\3\2\2\2\u0091\u026e\3\2\2\2\u0093\u0279\3\2\2\2\u0095"+
|
||||
"\u027c\3\2\2\2\u0097\u0287\3\2\2\2\u0099\u028e\3\2\2\2\u009b\u0290\3\2"+
|
||||
"\2\2\u009d\u029b\3\2\2\2\u009f\u00a0\7*\2\2\u00a0\4\3\2\2\2\u00a1\u00a2"+
|
||||
"\7+\2\2\u00a2\6\3\2\2\2\u00a3\u00a4\7u\2\2\u00a4\u00a5\7g\2\2\u00a5\u00a6"+
|
||||
"\7n\2\2\u00a6\u00a7\7g\2\2\u00a7\u00a8\7e\2\2\u00a8\u00a9\7v\2\2\u00a9"+
|
||||
"\b\3\2\2\2\u00aa\u00ab\7f\2\2\u00ab\u00ac\7k\2\2\u00ac\u00ad\7u\2\2\u00ad"+
|
||||
"\u00ae\7v\2\2\u00ae\u00af\7k\2\2\u00af\u00b0\7p\2\2\u00b0\u00b1\7e\2\2"+
|
||||
"\u00b1\u00b2\7v\2\2\u00b2\n\3\2\2\2\u00b3\u00b4\7y\2\2\u00b4\u00b5\7j"+
|
||||
"\2\2\u00b5\u00b6\7g\2\2\u00b6\u00b7\7t\2\2\u00b7\u00b8\7g\2\2\u00b8\f"+
|
||||
"\3\2\2\2\u00b9\u00ba\7q\2\2\u00ba\u00bb\7t\2\2\u00bb\u00bc\7f\2\2\u00bc"+
|
||||
"\u00bd\7g\2\2\u00bd\u00be\7t\2\2\u00be\16\3\2\2\2\u00bf\u00c0\7d\2\2\u00c0"+
|
||||
"\u00c1\7{\2\2\u00c1\20\3\2\2\2\u00c2\u00c3\7.\2\2\u00c3\22\3\2\2\2\u00c4"+
|
||||
"\u00c5\7p\2\2\u00c5\u00c6\7w\2\2\u00c6\u00c7\7n\2\2\u00c7\u00c8\7n\2\2"+
|
||||
"\u00c8\u00c9\7u\2\2\u00c9\24\3\2\2\2\u00ca\u00cb\7h\2\2\u00cb\u00cc\7"+
|
||||
"k\2\2\u00cc\u00cd\7t\2\2\u00cd\u00ce\7u\2\2\u00ce\u00cf\7v\2\2\u00cf\26"+
|
||||
"\3\2\2\2\u00d0\u00d1\7n\2\2\u00d1\u00d2\7c\2\2\u00d2\u00d3\7u\2\2\u00d3"+
|
||||
"\u00d4\7v\2\2\u00d4\30\3\2\2\2\u00d5\u00d6\7c\2\2\u00d6\u00d7\7u\2\2\u00d7"+
|
||||
"\u00d8\7e\2\2\u00d8\32\3\2\2\2\u00d9\u00da\7f\2\2\u00da\u00db\7g\2\2\u00db"+
|
||||
"\u00dc\7u\2\2\u00dc\u00dd\7e\2\2\u00dd\34\3\2\2\2\u00de\u00df\7n\2\2\u00df"+
|
||||
"\u00e0\7k\2\2\u00e0\u00e1\7o\2\2\u00e1\u00e2\7k\2\2\u00e2\u00e3\7v\2\2"+
|
||||
"\u00e3\36\3\2\2\2\u00e4\u00e5\7q\2\2\u00e5\u00e6\7h\2\2\u00e6\u00e7\7"+
|
||||
"h\2\2\u00e7\u00e8\7u\2\2\u00e8\u00e9\7g\2\2\u00e9\u00ea\7v\2\2\u00ea "+
|
||||
"\3\2\2\2\u00eb\u00ec\7h\2\2\u00ec\u00ed\7g\2\2\u00ed\u00ee\7v\2\2\u00ee"+
|
||||
"\u00ef\7e\2\2\u00ef\u00f0\7j\2\2\u00f0\"\3\2\2\2\u00f1\u00f2\7-\2\2\u00f2"+
|
||||
"$\3\2\2\2\u00f3\u00f4\7s\2\2\u00f4\u00f5\7w\2\2\u00f5\u00f6\7g\2\2\u00f6"+
|
||||
"\u00f7\7t\2\2\u00f7\u00f8\7{\2\2\u00f8&\3\2\2\2\u00f9\u00fa\7n\2\2\u00fa"+
|
||||
"\u00fb\7c\2\2\u00fb\u00fc\7|\2\2\u00fc\u00fd\7{\2\2\u00fd(\3\2\2\2\u00fe"+
|
||||
"\u00ff\7q\2\2\u00ff\u0100\7t\2\2\u0100*\3\2\2\2\u0101\u0102\7c\2\2\u0102"+
|
||||
"\u0103\7p\2\2\u0103\u0104\7f\2\2\u0104,\3\2\2\2\u0105\u0106\7p\2\2\u0106"+
|
||||
"\u0107\7q\2\2\u0107\u0108\7v\2\2\u0108.\3\2\2\2\u0109\u010a\7k\2\2\u010a"+
|
||||
"\u010b\7p\2\2\u010b\u010c\7Q\2\2\u010c\u010d\7t\2\2\u010d\u010e\7G\2\2"+
|
||||
"\u010e\u010f\7o\2\2\u010f\u0110\7r\2\2\u0110\u0111\7v\2\2\u0111\u0112"+
|
||||
"\7{\2\2\u0112\60\3\2\2\2\u0113\u0114\7k\2\2\u0114\u0115\7p\2\2\u0115\62"+
|
||||
"\3\2\2\2\u0116\u0117\7d\2\2\u0117\u0118\7g\2\2\u0118\u0119\7v\2\2\u0119"+
|
||||
"\u011a\7y\2\2\u011a\u011b\7g\2\2\u011b\u011c\7g\2\2\u011c\u011d\7p\2\2"+
|
||||
"\u011d\64\3\2\2\2\u011e\u011f\7v\2\2\u011f\u0120\7q\2\2\u0120\66\3\2\2"+
|
||||
"\2\u0121\u0122\7k\2\2\u0122\u0123\7p\2\2\u0123\u0124\7t\2\2\u0124\u0125"+
|
||||
"\7c\2\2\u0125\u0126\7p\2\2\u0126\u0127\7i\2\2\u0127\u0128\7g\2\2\u0128"+
|
||||
"8\3\2\2\2\u0129\u012a\7k\2\2\u012a\u012b\7p\2\2\u012b\u012c\7T\2\2\u012c"+
|
||||
"\u012d\7c\2\2\u012d\u012e\7p\2\2\u012e\u012f\7i\2\2\u012f\u0130\7g\2\2"+
|
||||
"\u0130:\3\2\2\2\u0131\u0132\7k\2\2\u0132\u0133\7u\2\2\u0133<\3\2\2\2\u0134"+
|
||||
"\u0135\7p\2\2\u0135\u0136\7w\2\2\u0136\u0137\7n\2\2\u0137\u0138\7n\2\2"+
|
||||
"\u0138>\3\2\2\2\u0139\u013a\7k\2\2\u013a\u013b\7u\2\2\u013b\u013c\7P\2"+
|
||||
"\2\u013c\u013d\7w\2\2\u013d\u013e\7n\2\2\u013e\u013f\7n\2\2\u013f@\3\2"+
|
||||
"\2\2\u0140\u0141\7k\2\2\u0141\u0142\7u\2\2\u0142\u0143\7P\2\2\u0143\u0144"+
|
||||
"\7q\2\2\u0144\u0145\7v\2\2\u0145\u0146\7P\2\2\u0146\u0147\7w\2\2\u0147"+
|
||||
"\u0148\7n\2\2\u0148\u0149\7n\2\2\u0149B\3\2\2\2\u014a\u014b\7p\2\2\u014b"+
|
||||
"\u014c\7q\2\2\u014c\u014d\7v\2\2\u014d\u014e\7P\2\2\u014e\u014f\7w\2\2"+
|
||||
"\u014f\u0150\7n\2\2\u0150\u0151\7n\2\2\u0151D\3\2\2\2\u0152\u0153\7g\2"+
|
||||
"\2\u0153\u0154\7o\2\2\u0154\u0155\7r\2\2\u0155\u0156\7v\2\2\u0156\u0157"+
|
||||
"\7{\2\2\u0157F\3\2\2\2\u0158\u0159\7k\2\2\u0159\u015a\7u\2\2\u015a\u015b"+
|
||||
"\7G\2\2\u015b\u015c\7o\2\2\u015c\u015d\7r\2\2\u015d\u015e\7v\2\2\u015e"+
|
||||
"\u015f\7{\2\2\u015fH\3\2\2\2\u0160\u0161\7k\2\2\u0161\u0162\7u\2\2\u0162"+
|
||||
"\u0163\7P\2\2\u0163\u0164\7q\2\2\u0164\u0165\7v\2\2\u0165\u0166\7G\2\2"+
|
||||
"\u0166\u0167\7o\2\2\u0167\u0168\7r\2\2\u0168\u0169\7v\2\2\u0169\u016a"+
|
||||
"\7{\2\2\u016aJ\3\2\2\2\u016b\u016c\7p\2\2\u016c\u016d\7q\2\2\u016d\u016e"+
|
||||
"\7v\2\2\u016e\u016f\7G\2\2\u016f\u0170\7o\2\2\u0170\u0171\7r\2\2\u0171"+
|
||||
"\u0172\7v\2\2\u0172\u0173\7{\2\2\u0173L\3\2\2\2\u0174\u0175\7n\2\2\u0175"+
|
||||
"\u0176\7k\2\2\u0176\u0177\7m\2\2\u0177\u0178\7g\2\2\u0178N\3\2\2\2\u0179"+
|
||||
"\u017a\7k\2\2\u017a\u017b\7n\2\2\u017b\u017c\7k\2\2\u017c\u017d\7m\2\2"+
|
||||
"\u017d\u017e\7g\2\2\u017eP\3\2\2\2\u017f\u0180\7e\2\2\u0180\u0181\7q\2"+
|
||||
"\2\u0181\u0182\7p\2\2\u0182\u0183\7v\2\2\u0183\u0184\7c\2\2\u0184\u0185"+
|
||||
"\7k\2\2\u0185\u0186\7p\2\2\u0186\u0187\7u\2\2\u0187R\3\2\2\2\u0188\u0189"+
|
||||
"\7k\2\2\u0189\u018a\7e\2\2\u018a\u018b\7q\2\2\u018b\u018c\7p\2\2\u018c"+
|
||||
"\u018d\7v\2\2\u018d\u018e\7c\2\2\u018e\u018f\7k\2\2\u018f\u0190\7p\2\2"+
|
||||
"\u0190\u0191\7u\2\2\u0191T\3\2\2\2\u0192\u0193\7u\2\2\u0193\u0194\7v\2"+
|
||||
"\2\u0194\u0195\7c\2\2\u0195\u0196\7t\2\2\u0196\u0197\7v\2\2\u0197\u0198"+
|
||||
"\7u\2\2\u0198\u0199\7Y\2\2\u0199\u019a\7k\2\2\u019a\u019b\7v\2\2\u019b"+
|
||||
"\u019c\7j\2\2\u019cV\3\2\2\2\u019d\u019e\7k\2\2\u019e\u019f\7u\2\2\u019f"+
|
||||
"\u01a0\7v\2\2\u01a0\u01a1\7c\2\2\u01a1\u01a2\7t\2\2\u01a2\u01a3\7v\2\2"+
|
||||
"\u01a3\u01a4\7u\2\2\u01a4\u01a5\7Y\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7"+
|
||||
"\7v\2\2\u01a7\u01a8\7j\2\2\u01a8X\3\2\2\2\u01a9\u01aa\7g\2\2\u01aa\u01ab"+
|
||||
"\7p\2\2\u01ab\u01ac\7f\2\2\u01ac\u01ad\7u\2\2\u01ad\u01ae\7Y\2\2\u01ae"+
|
||||
"\u01af\7k\2\2\u01af\u01b0\7v\2\2\u01b0\u01b1\7j\2\2\u01b1Z\3\2\2\2\u01b2"+
|
||||
"\u01b3\7k\2\2\u01b3\u01b4\7g\2\2\u01b4\u01b5\7p\2\2\u01b5\u01b6\7f\2\2"+
|
||||
"\u01b6\u01b7\7u\2\2\u01b7\u01b8\7Y\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba"+
|
||||
"\7v\2\2\u01ba\u01bb\7j\2\2\u01bb\\\3\2\2\2\u01bc\u01bd\7?\2\2\u01bd^\3"+
|
||||
"\2\2\2\u01be\u01bf\7g\2\2\u01bf\u01c0\7s\2\2\u01c0`\3\2\2\2\u01c1\u01c2"+
|
||||
"\7@\2\2\u01c2b\3\2\2\2\u01c3\u01c4\7i\2\2\u01c4\u01c5\7v\2\2\u01c5d\3"+
|
||||
"\2\2\2\u01c6\u01c7\7@\2\2\u01c7\u01c8\7?\2\2\u01c8f\3\2\2\2\u01c9\u01ca"+
|
||||
"\7i\2\2\u01ca\u01cb\7g\2\2\u01cbh\3\2\2\2\u01cc\u01cd\7i\2\2\u01cd\u01ce"+
|
||||
"\7v\2\2\u01ce\u01cf\7g\2\2\u01cfj\3\2\2\2\u01d0\u01d1\7>\2\2\u01d1l\3"+
|
||||
"\2\2\2\u01d2\u01d3\7n\2\2\u01d3\u01d4\7v\2\2\u01d4n\3\2\2\2\u01d5\u01d6"+
|
||||
"\7>\2\2\u01d6\u01d7\7?\2\2\u01d7p\3\2\2\2\u01d8\u01d9\7n\2\2\u01d9\u01da"+
|
||||
"\7g\2\2\u01dar\3\2\2\2\u01db\u01dc\7n\2\2\u01dc\u01dd\7v\2\2\u01dd\u01de"+
|
||||
"\7g\2\2\u01det\3\2\2\2\u01df\u01e0\7>\2\2\u01e0\u01e1\7@\2\2\u01e1v\3"+
|
||||
"\2\2\2\u01e2\u01e3\7#\2\2\u01e3\u01e4\7?\2\2\u01e4x\3\2\2\2\u01e5\u01e6"+
|
||||
"\7p\2\2\u01e6\u01e7\7g\2\2\u01e7z\3\2\2\2\u01e8\u01e9\7k\2\2\u01e9\u01ea"+
|
||||
"\7g\2\2\u01ea\u01eb\7s\2\2\u01eb|\3\2\2\2\u01ec\u01ed\7k\2\2\u01ed\u01ee"+
|
||||
"\7p\2\2\u01ee\u01ef\7g\2\2\u01ef~\3\2\2\2\u01f0\u01f1\7g\2\2\u01f1\u01f2"+
|
||||
"\7s\2\2\u01f2\u01f3\7Q\2\2\u01f3\u01f4\7t\2\2\u01f4\u01f5\7P\2\2\u01f5"+
|
||||
"\u01f6\7w\2\2\u01f6\u01f7\7n\2\2\u01f7\u01f8\7n\2\2\u01f8\u0080\3\2\2"+
|
||||
"\2\u01f9\u01fa\7i\2\2\u01fa\u01fb\7v\2\2\u01fb\u01fc\7Q\2\2\u01fc\u01fd"+
|
||||
"\7t\2\2\u01fd\u01fe\7P\2\2\u01fe\u01ff\7w\2\2\u01ff\u0200\7n\2\2\u0200"+
|
||||
"\u0201\7n\2\2\u0201\u0082\3\2\2\2\u0202\u0203\7n\2\2\u0203\u0204\7v\2"+
|
||||
"\2\u0204\u0205\7Q\2\2\u0205\u0206\7t\2\2\u0206\u0207\7P\2\2\u0207\u0208"+
|
||||
"\7w\2\2\u0208\u0209\7n\2\2\u0209\u020a\7n\2\2\u020a\u0084\3\2\2\2\u020b"+
|
||||
"\u020c\7i\2\2\u020c\u020d\7g\2\2\u020d\u020e\7Q\2\2\u020e\u020f\7t\2\2"+
|
||||
"\u020f\u0210\7P\2\2\u0210\u0211\7w\2\2\u0211\u0212\7n\2\2\u0212\u0213"+
|
||||
"\7n\2\2\u0213\u0086\3\2\2\2\u0214\u0215\7n\2\2\u0215\u0216\7g\2\2\u0216"+
|
||||
"\u0217\7Q\2\2\u0217\u0218\7t\2\2\u0218\u0219\7P\2\2\u0219\u021a\7w\2\2"+
|
||||
"\u021a\u021b\7n\2\2\u021b\u021c\7n\2\2\u021c\u0088\3\2\2\2\u021d\u021e"+
|
||||
"\7<\2\2\u021e\u0222\t\2\2\2\u021f\u0221\t\3\2\2\u0220\u021f\3\2\2\2\u0221"+
|
||||
"\u0224\3\2\2\2\u0222\u0220\3\2\2\2\u0222\u0223\3\2\2\2\u0223\u022d\3\2"+
|
||||
"\2\2\u0224\u0222\3\2\2\2\u0225\u0229\7A\2\2\u0226\u0228\4\62;\2\u0227"+
|
||||
"\u0226\3\2\2\2\u0228\u022b\3\2\2\2\u0229\u0227\3\2\2\2\u0229\u022a\3\2"+
|
||||
"\2\2\u022a\u022d\3\2\2\2\u022b\u0229\3\2\2\2\u022c\u021d\3\2\2\2\u022c"+
|
||||
"\u0225\3\2\2\2\u022d\u008a\3\2\2\2\u022e\u0232\t\2\2\2\u022f\u0231\t\4"+
|
||||
"\2\2\u0230\u022f\3\2\2\2\u0231\u0234\3\2\2\2\u0232\u0230\3\2\2\2\u0232"+
|
||||
"\u0233\3\2\2\2\u0233\u008c\3\2\2\2\u0234\u0232\3\2\2\2\u0235\u0236\7b"+
|
||||
"\2\2\u0236\u0237\5\u008bF\2\u0237\u0238\7b\2\2\u0238\u008e\3\2\2\2\u0239"+
|
||||
"\u023a\7u\2\2\u023a\u023b\7w\2\2\u023b\u023c\7o\2\2\u023c\u023d\7*\2\2"+
|
||||
"\u023d\u023e\3\2\2\2\u023e\u023f\5\u008bF\2\u023f\u0240\7+\2\2\u0240\u0264"+
|
||||
"\3\2\2\2\u0241\u0242\7o\2\2\u0242\u0243\7c\2\2\u0243\u0244\7z\2\2\u0244"+
|
||||
"\u0245\7*\2\2\u0245\u0246\3\2\2\2\u0246\u0247\5\u008bF\2\u0247\u0248\7"+
|
||||
"+\2\2\u0248\u0264\3\2\2\2\u0249\u024a\7o\2\2\u024a\u024b\7k\2\2\u024b"+
|
||||
"\u024c\7p\2\2\u024c\u024d\7*\2\2\u024d\u024e\3\2\2\2\u024e\u024f\5\u008b"+
|
||||
"F\2\u024f\u0250\7+\2\2\u0250\u0264\3\2\2\2\u0251\u0252\7c\2\2\u0252\u0253"+
|
||||
"\7x\2\2\u0253\u0254\7i\2\2\u0254\u0255\7*\2\2\u0255\u0256\3\2\2\2\u0256"+
|
||||
"\u0257\5\u008bF\2\u0257\u0258\7+\2\2\u0258\u0264\3\2\2\2\u0259\u025a\7"+
|
||||
"e\2\2\u025a\u025b\7q\2\2\u025b\u025c\7w\2\2\u025c\u025d\7p\2\2\u025d\u025e"+
|
||||
"\7v\2\2\u025e\u025f\7*\2\2\u025f\u0260\3\2\2\2\u0260\u0261\5\u008bF\2"+
|
||||
"\u0261\u0262\7+\2\2\u0262\u0264\3\2\2\2\u0263\u0239\3\2\2\2\u0263\u0241"+
|
||||
"\3\2\2\2\u0263\u0249\3\2\2\2\u0263\u0251\3\2\2\2\u0263\u0259\3\2\2\2\u0264"+
|
||||
"\u0090\3\2\2\2\u0265\u0266\7v\2\2\u0266\u0267\7t\2\2\u0267\u0268\7w\2"+
|
||||
"\2\u0268\u026f\7g\2\2\u0269\u026a\7h\2\2\u026a\u026b\7c\2\2\u026b\u026c"+
|
||||
"\7n\2\2\u026c\u026d\7u\2\2\u026d\u026f\7g\2\2\u026e\u0265\3\2\2\2\u026e"+
|
||||
"\u0269\3\2\2\2\u026f\u0092\3\2\2\2\u0270\u0272\7/\2\2\u0271\u0270\3\2"+
|
||||
"\2\2\u0271\u0272\3\2\2\2\u0272\u0273\3\2\2\2\u0273\u027a\5\u0095K\2\u0274"+
|
||||
"\u0276\7/\2\2\u0275\u0274\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0277\3\2"+
|
||||
"\2\2\u0277\u027a\5\u0097L\2\u0278\u027a\5\u0099M\2\u0279\u0271\3\2\2\2"+
|
||||
"\u0279\u0275\3\2\2\2\u0279\u0278\3\2\2\2\u027a\u0094\3\2\2\2\u027b\u027d"+
|
||||
"\t\5\2\2\u027c\u027b\3\2\2\2\u027d\u027e\3\2\2\2\u027e\u027c\3\2\2\2\u027e"+
|
||||
"\u027f\3\2\2\2\u027f\u0280\3\2\2\2\u0280\u0284\7\60\2\2\u0281\u0283\t"+
|
||||
"\5\2\2\u0282\u0281\3\2\2\2\u0283\u0286\3\2\2\2\u0284\u0282\3\2\2\2\u0284"+
|
||||
"\u0285\3\2\2\2\u0285\u0096\3\2\2\2\u0286\u0284\3\2\2\2\u0287\u028b\t\6"+
|
||||
"\2\2\u0288\u028a\t\5\2\2\u0289\u0288\3\2\2\2\u028a\u028d\3\2\2\2\u028b"+
|
||||
"\u0289\3\2\2\2\u028b\u028c\3\2\2\2\u028c\u0098\3\2\2\2\u028d\u028b\3\2"+
|
||||
"\2\2\u028e\u028f\7\62\2\2\u028f\u009a\3\2\2\2\u0290\u0296\7)\2\2\u0291"+
|
||||
"\u0295\n\7\2\2\u0292\u0293\7)\2\2\u0293\u0295\7)\2\2\u0294\u0291\3\2\2"+
|
||||
"\2\u0294\u0292\3\2\2\2\u0295\u0298\3\2\2\2\u0296\u0294\3\2\2\2\u0296\u0297"+
|
||||
"\3\2\2\2\u0297\u0299\3\2\2\2\u0298\u0296\3\2\2\2\u0299\u029a\7)\2\2\u029a"+
|
||||
"\u009c\3\2\2\2\u029b\u029c\t\b\2\2\u029c\u029d\3\2\2\2\u029d\u029e\bO"+
|
||||
"\2\2\u029e\u009e\3\2\2\2\21\2\u0222\u0229\u022c\u0232\u0263\u026e\u0271"+
|
||||
"\u0275\u0279\u027e\u0284\u028b\u0294\u0296\3\b\2\2";
|
||||
"\u0004\u0000N\u029d\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+
|
||||
"\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+
|
||||
"\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+
|
||||
"\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+
|
||||
"\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+
|
||||
"\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+
|
||||
"\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+
|
||||
"\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+
|
||||
"\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+
|
||||
"\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+
|
||||
"\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+
|
||||
"!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+
|
||||
"&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+
|
||||
"+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+
|
||||
"0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+
|
||||
"5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+
|
||||
":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+
|
||||
"?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+
|
||||
"D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+
|
||||
"I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0001\u0000"+
|
||||
"\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002"+
|
||||
"\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003"+
|
||||
"\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
|
||||
"\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
|
||||
"\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
|
||||
"\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007"+
|
||||
"\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+
|
||||
"\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+
|
||||
"\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001"+
|
||||
"\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e"+
|
||||
"\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+
|
||||
"\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+
|
||||
"\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+
|
||||
"\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+
|
||||
"\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014"+
|
||||
"\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+
|
||||
"\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+
|
||||
"\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017"+
|
||||
"\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+
|
||||
"\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+
|
||||
"\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+
|
||||
"\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+
|
||||
"\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c"+
|
||||
"\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+
|
||||
"\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+
|
||||
"\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+
|
||||
"\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001"+
|
||||
" \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+
|
||||
"!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+
|
||||
"\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+
|
||||
"#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+
|
||||
"$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001"+
|
||||
"&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+
|
||||
"\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+
|
||||
"(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+
|
||||
")\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+
|
||||
"*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001"+
|
||||
"+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+
|
||||
",\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001.\u0001.\u0001.\u0001"+
|
||||
"/\u0001/\u00010\u00010\u00010\u00011\u00011\u00011\u00012\u00012\u0001"+
|
||||
"2\u00013\u00013\u00013\u00013\u00014\u00014\u00015\u00015\u00015\u0001"+
|
||||
"6\u00016\u00016\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+
|
||||
"9\u00019\u00019\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001<\u0001"+
|
||||
"<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001"+
|
||||
">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+
|
||||
"?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+
|
||||
"@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+
|
||||
"A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+
|
||||
"B\u0001B\u0001C\u0001C\u0001C\u0005C\u021f\bC\nC\fC\u0222\tC\u0001C\u0001"+
|
||||
"C\u0005C\u0226\bC\nC\fC\u0229\tC\u0003C\u022b\bC\u0001D\u0001D\u0005D"+
|
||||
"\u022f\bD\nD\fD\u0232\tD\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001"+
|
||||
"F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+
|
||||
"F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+
|
||||
"F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+
|
||||
"F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0003"+
|
||||
"F\u0262\bF\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+
|
||||
"G\u0003G\u026d\bG\u0001H\u0003H\u0270\bH\u0001H\u0001H\u0003H\u0274\b"+
|
||||
"H\u0001H\u0001H\u0003H\u0278\bH\u0001I\u0004I\u027b\bI\u000bI\fI\u027c"+
|
||||
"\u0001I\u0001I\u0005I\u0281\bI\nI\fI\u0284\tI\u0001J\u0001J\u0005J\u0288"+
|
||||
"\bJ\nJ\fJ\u028b\tJ\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0005L\u0293"+
|
||||
"\bL\nL\fL\u0296\tL\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0000\u0000"+
|
||||
"N\u0001\u0001\u0003\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006"+
|
||||
"\r\u0007\u000f\b\u0011\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b\u000e"+
|
||||
"\u001d\u000f\u001f\u0010!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017"+
|
||||
"/\u00181\u00193\u001a5\u001b7\u001c9\u001d;\u001e=\u001f? A!C\"E#G$I%"+
|
||||
"K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6m7o8q9s:u;w<y={>}?\u007f@\u0081A\u0083"+
|
||||
"B\u0085C\u0087D\u0089E\u008bF\u008dG\u008fH\u0091I\u0093J\u0095K\u0097"+
|
||||
"L\u0099M\u009bN\u0001\u0000\u0007\u0003\u0000AZ__az\u0004\u000009AZ__"+
|
||||
"az\u0005\u0000..09AZ__az\u0001\u000009\u0001\u000019\u0001\u0000\'\'\u0003"+
|
||||
"\u0000\t\n\r\r \u02ae\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003"+
|
||||
"\u0001\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007"+
|
||||
"\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001"+
|
||||
"\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000"+
|
||||
"\u0000\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000"+
|
||||
"\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000"+
|
||||
"\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000"+
|
||||
"\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000"+
|
||||
"\u0000\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000"+
|
||||
"\u0000%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000"+
|
||||
")\u0001\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001"+
|
||||
"\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000"+
|
||||
"\u0000\u00003\u0001\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u0000"+
|
||||
"7\u0001\u0000\u0000\u0000\u00009\u0001\u0000\u0000\u0000\u0000;\u0001"+
|
||||
"\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000\u0000?\u0001\u0000\u0000"+
|
||||
"\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C\u0001\u0000\u0000\u0000\u0000"+
|
||||
"E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000\u0000I\u0001"+
|
||||
"\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000\u0000M\u0001\u0000\u0000"+
|
||||
"\u0000\u0000O\u0001\u0000\u0000\u0000\u0000Q\u0001\u0000\u0000\u0000\u0000"+
|
||||
"S\u0001\u0000\u0000\u0000\u0000U\u0001\u0000\u0000\u0000\u0000W\u0001"+
|
||||
"\u0000\u0000\u0000\u0000Y\u0001\u0000\u0000\u0000\u0000[\u0001\u0000\u0000"+
|
||||
"\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_\u0001\u0000\u0000\u0000\u0000"+
|
||||
"a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000\u0000\u0000\u0000e\u0001"+
|
||||
"\u0000\u0000\u0000\u0000g\u0001\u0000\u0000\u0000\u0000i\u0001\u0000\u0000"+
|
||||
"\u0000\u0000k\u0001\u0000\u0000\u0000\u0000m\u0001\u0000\u0000\u0000\u0000"+
|
||||
"o\u0001\u0000\u0000\u0000\u0000q\u0001\u0000\u0000\u0000\u0000s\u0001"+
|
||||
"\u0000\u0000\u0000\u0000u\u0001\u0000\u0000\u0000\u0000w\u0001\u0000\u0000"+
|
||||
"\u0000\u0000y\u0001\u0000\u0000\u0000\u0000{\u0001\u0000\u0000\u0000\u0000"+
|
||||
"}\u0001\u0000\u0000\u0000\u0000\u007f\u0001\u0000\u0000\u0000\u0000\u0081"+
|
||||
"\u0001\u0000\u0000\u0000\u0000\u0083\u0001\u0000\u0000\u0000\u0000\u0085"+
|
||||
"\u0001\u0000\u0000\u0000\u0000\u0087\u0001\u0000\u0000\u0000\u0000\u0089"+
|
||||
"\u0001\u0000\u0000\u0000\u0000\u008b\u0001\u0000\u0000\u0000\u0000\u008d"+
|
||||
"\u0001\u0000\u0000\u0000\u0000\u008f\u0001\u0000\u0000\u0000\u0000\u0091"+
|
||||
"\u0001\u0000\u0000\u0000\u0000\u0093\u0001\u0000\u0000\u0000\u0000\u0095"+
|
||||
"\u0001\u0000\u0000\u0000\u0000\u0097\u0001\u0000\u0000\u0000\u0000\u0099"+
|
||||
"\u0001\u0000\u0000\u0000\u0000\u009b\u0001\u0000\u0000\u0000\u0001\u009d"+
|
||||
"\u0001\u0000\u0000\u0000\u0003\u009f\u0001\u0000\u0000\u0000\u0005\u00a1"+
|
||||
"\u0001\u0000\u0000\u0000\u0007\u00a8\u0001\u0000\u0000\u0000\t\u00b1\u0001"+
|
||||
"\u0000\u0000\u0000\u000b\u00b7\u0001\u0000\u0000\u0000\r\u00bd\u0001\u0000"+
|
||||
"\u0000\u0000\u000f\u00c0\u0001\u0000\u0000\u0000\u0011\u00c2\u0001\u0000"+
|
||||
"\u0000\u0000\u0013\u00c8\u0001\u0000\u0000\u0000\u0015\u00ce\u0001\u0000"+
|
||||
"\u0000\u0000\u0017\u00d3\u0001\u0000\u0000\u0000\u0019\u00d7\u0001\u0000"+
|
||||
"\u0000\u0000\u001b\u00dc\u0001\u0000\u0000\u0000\u001d\u00e2\u0001\u0000"+
|
||||
"\u0000\u0000\u001f\u00e9\u0001\u0000\u0000\u0000!\u00ef\u0001\u0000\u0000"+
|
||||
"\u0000#\u00f1\u0001\u0000\u0000\u0000%\u00f7\u0001\u0000\u0000\u0000\'"+
|
||||
"\u00fc\u0001\u0000\u0000\u0000)\u00ff\u0001\u0000\u0000\u0000+\u0103\u0001"+
|
||||
"\u0000\u0000\u0000-\u0107\u0001\u0000\u0000\u0000/\u0111\u0001\u0000\u0000"+
|
||||
"\u00001\u0114\u0001\u0000\u0000\u00003\u011c\u0001\u0000\u0000\u00005"+
|
||||
"\u011f\u0001\u0000\u0000\u00007\u0127\u0001\u0000\u0000\u00009\u012f\u0001"+
|
||||
"\u0000\u0000\u0000;\u0132\u0001\u0000\u0000\u0000=\u0137\u0001\u0000\u0000"+
|
||||
"\u0000?\u013e\u0001\u0000\u0000\u0000A\u0148\u0001\u0000\u0000\u0000C"+
|
||||
"\u0150\u0001\u0000\u0000\u0000E\u0156\u0001\u0000\u0000\u0000G\u015e\u0001"+
|
||||
"\u0000\u0000\u0000I\u0169\u0001\u0000\u0000\u0000K\u0172\u0001\u0000\u0000"+
|
||||
"\u0000M\u0177\u0001\u0000\u0000\u0000O\u017d\u0001\u0000\u0000\u0000Q"+
|
||||
"\u0186\u0001\u0000\u0000\u0000S\u0190\u0001\u0000\u0000\u0000U\u019b\u0001"+
|
||||
"\u0000\u0000\u0000W\u01a7\u0001\u0000\u0000\u0000Y\u01b0\u0001\u0000\u0000"+
|
||||
"\u0000[\u01ba\u0001\u0000\u0000\u0000]\u01bc\u0001\u0000\u0000\u0000_"+
|
||||
"\u01bf\u0001\u0000\u0000\u0000a\u01c1\u0001\u0000\u0000\u0000c\u01c4\u0001"+
|
||||
"\u0000\u0000\u0000e\u01c7\u0001\u0000\u0000\u0000g\u01ca\u0001\u0000\u0000"+
|
||||
"\u0000i\u01ce\u0001\u0000\u0000\u0000k\u01d0\u0001\u0000\u0000\u0000m"+
|
||||
"\u01d3\u0001\u0000\u0000\u0000o\u01d6\u0001\u0000\u0000\u0000q\u01d9\u0001"+
|
||||
"\u0000\u0000\u0000s\u01dd\u0001\u0000\u0000\u0000u\u01e0\u0001\u0000\u0000"+
|
||||
"\u0000w\u01e3\u0001\u0000\u0000\u0000y\u01e6\u0001\u0000\u0000\u0000{"+
|
||||
"\u01ea\u0001\u0000\u0000\u0000}\u01ee\u0001\u0000\u0000\u0000\u007f\u01f7"+
|
||||
"\u0001\u0000\u0000\u0000\u0081\u0200\u0001\u0000\u0000\u0000\u0083\u0209"+
|
||||
"\u0001\u0000\u0000\u0000\u0085\u0212\u0001\u0000\u0000\u0000\u0087\u022a"+
|
||||
"\u0001\u0000\u0000\u0000\u0089\u022c\u0001\u0000\u0000\u0000\u008b\u0233"+
|
||||
"\u0001\u0000\u0000\u0000\u008d\u0261\u0001\u0000\u0000\u0000\u008f\u026c"+
|
||||
"\u0001\u0000\u0000\u0000\u0091\u0277\u0001\u0000\u0000\u0000\u0093\u027a"+
|
||||
"\u0001\u0000\u0000\u0000\u0095\u0285\u0001\u0000\u0000\u0000\u0097\u028c"+
|
||||
"\u0001\u0000\u0000\u0000\u0099\u028e\u0001\u0000\u0000\u0000\u009b\u0299"+
|
||||
"\u0001\u0000\u0000\u0000\u009d\u009e\u0005(\u0000\u0000\u009e\u0002\u0001"+
|
||||
"\u0000\u0000\u0000\u009f\u00a0\u0005)\u0000\u0000\u00a0\u0004\u0001\u0000"+
|
||||
"\u0000\u0000\u00a1\u00a2\u0005s\u0000\u0000\u00a2\u00a3\u0005e\u0000\u0000"+
|
||||
"\u00a3\u00a4\u0005l\u0000\u0000\u00a4\u00a5\u0005e\u0000\u0000\u00a5\u00a6"+
|
||||
"\u0005c\u0000\u0000\u00a6\u00a7\u0005t\u0000\u0000\u00a7\u0006\u0001\u0000"+
|
||||
"\u0000\u0000\u00a8\u00a9\u0005d\u0000\u0000\u00a9\u00aa\u0005i\u0000\u0000"+
|
||||
"\u00aa\u00ab\u0005s\u0000\u0000\u00ab\u00ac\u0005t\u0000\u0000\u00ac\u00ad"+
|
||||
"\u0005i\u0000\u0000\u00ad\u00ae\u0005n\u0000\u0000\u00ae\u00af\u0005c"+
|
||||
"\u0000\u0000\u00af\u00b0\u0005t\u0000\u0000\u00b0\b\u0001\u0000\u0000"+
|
||||
"\u0000\u00b1\u00b2\u0005w\u0000\u0000\u00b2\u00b3\u0005h\u0000\u0000\u00b3"+
|
||||
"\u00b4\u0005e\u0000\u0000\u00b4\u00b5\u0005r\u0000\u0000\u00b5\u00b6\u0005"+
|
||||
"e\u0000\u0000\u00b6\n\u0001\u0000\u0000\u0000\u00b7\u00b8\u0005o\u0000"+
|
||||
"\u0000\u00b8\u00b9\u0005r\u0000\u0000\u00b9\u00ba\u0005d\u0000\u0000\u00ba"+
|
||||
"\u00bb\u0005e\u0000\u0000\u00bb\u00bc\u0005r\u0000\u0000\u00bc\f\u0001"+
|
||||
"\u0000\u0000\u0000\u00bd\u00be\u0005b\u0000\u0000\u00be\u00bf\u0005y\u0000"+
|
||||
"\u0000\u00bf\u000e\u0001\u0000\u0000\u0000\u00c0\u00c1\u0005,\u0000\u0000"+
|
||||
"\u00c1\u0010\u0001\u0000\u0000\u0000\u00c2\u00c3\u0005n\u0000\u0000\u00c3"+
|
||||
"\u00c4\u0005u\u0000\u0000\u00c4\u00c5\u0005l\u0000\u0000\u00c5\u00c6\u0005"+
|
||||
"l\u0000\u0000\u00c6\u00c7\u0005s\u0000\u0000\u00c7\u0012\u0001\u0000\u0000"+
|
||||
"\u0000\u00c8\u00c9\u0005f\u0000\u0000\u00c9\u00ca\u0005i\u0000\u0000\u00ca"+
|
||||
"\u00cb\u0005r\u0000\u0000\u00cb\u00cc\u0005s\u0000\u0000\u00cc\u00cd\u0005"+
|
||||
"t\u0000\u0000\u00cd\u0014\u0001\u0000\u0000\u0000\u00ce\u00cf\u0005l\u0000"+
|
||||
"\u0000\u00cf\u00d0\u0005a\u0000\u0000\u00d0\u00d1\u0005s\u0000\u0000\u00d1"+
|
||||
"\u00d2\u0005t\u0000\u0000\u00d2\u0016\u0001\u0000\u0000\u0000\u00d3\u00d4"+
|
||||
"\u0005a\u0000\u0000\u00d4\u00d5\u0005s\u0000\u0000\u00d5\u00d6\u0005c"+
|
||||
"\u0000\u0000\u00d6\u0018\u0001\u0000\u0000\u0000\u00d7\u00d8\u0005d\u0000"+
|
||||
"\u0000\u00d8\u00d9\u0005e\u0000\u0000\u00d9\u00da\u0005s\u0000\u0000\u00da"+
|
||||
"\u00db\u0005c\u0000\u0000\u00db\u001a\u0001\u0000\u0000\u0000\u00dc\u00dd"+
|
||||
"\u0005l\u0000\u0000\u00dd\u00de\u0005i\u0000\u0000\u00de\u00df\u0005m"+
|
||||
"\u0000\u0000\u00df\u00e0\u0005i\u0000\u0000\u00e0\u00e1\u0005t\u0000\u0000"+
|
||||
"\u00e1\u001c\u0001\u0000\u0000\u0000\u00e2\u00e3\u0005o\u0000\u0000\u00e3"+
|
||||
"\u00e4\u0005f\u0000\u0000\u00e4\u00e5\u0005f\u0000\u0000\u00e5\u00e6\u0005"+
|
||||
"s\u0000\u0000\u00e6\u00e7\u0005e\u0000\u0000\u00e7\u00e8\u0005t\u0000"+
|
||||
"\u0000\u00e8\u001e\u0001\u0000\u0000\u0000\u00e9\u00ea\u0005f\u0000\u0000"+
|
||||
"\u00ea\u00eb\u0005e\u0000\u0000\u00eb\u00ec\u0005t\u0000\u0000\u00ec\u00ed"+
|
||||
"\u0005c\u0000\u0000\u00ed\u00ee\u0005h\u0000\u0000\u00ee \u0001\u0000"+
|
||||
"\u0000\u0000\u00ef\u00f0\u0005+\u0000\u0000\u00f0\"\u0001\u0000\u0000"+
|
||||
"\u0000\u00f1\u00f2\u0005q\u0000\u0000\u00f2\u00f3\u0005u\u0000\u0000\u00f3"+
|
||||
"\u00f4\u0005e\u0000\u0000\u00f4\u00f5\u0005r\u0000\u0000\u00f5\u00f6\u0005"+
|
||||
"y\u0000\u0000\u00f6$\u0001\u0000\u0000\u0000\u00f7\u00f8\u0005l\u0000"+
|
||||
"\u0000\u00f8\u00f9\u0005a\u0000\u0000\u00f9\u00fa\u0005z\u0000\u0000\u00fa"+
|
||||
"\u00fb\u0005y\u0000\u0000\u00fb&\u0001\u0000\u0000\u0000\u00fc\u00fd\u0005"+
|
||||
"o\u0000\u0000\u00fd\u00fe\u0005r\u0000\u0000\u00fe(\u0001\u0000\u0000"+
|
||||
"\u0000\u00ff\u0100\u0005a\u0000\u0000\u0100\u0101\u0005n\u0000\u0000\u0101"+
|
||||
"\u0102\u0005d\u0000\u0000\u0102*\u0001\u0000\u0000\u0000\u0103\u0104\u0005"+
|
||||
"n\u0000\u0000\u0104\u0105\u0005o\u0000\u0000\u0105\u0106\u0005t\u0000"+
|
||||
"\u0000\u0106,\u0001\u0000\u0000\u0000\u0107\u0108\u0005i\u0000\u0000\u0108"+
|
||||
"\u0109\u0005n\u0000\u0000\u0109\u010a\u0005O\u0000\u0000\u010a\u010b\u0005"+
|
||||
"r\u0000\u0000\u010b\u010c\u0005E\u0000\u0000\u010c\u010d\u0005m\u0000"+
|
||||
"\u0000\u010d\u010e\u0005p\u0000\u0000\u010e\u010f\u0005t\u0000\u0000\u010f"+
|
||||
"\u0110\u0005y\u0000\u0000\u0110.\u0001\u0000\u0000\u0000\u0111\u0112\u0005"+
|
||||
"i\u0000\u0000\u0112\u0113\u0005n\u0000\u0000\u01130\u0001\u0000\u0000"+
|
||||
"\u0000\u0114\u0115\u0005b\u0000\u0000\u0115\u0116\u0005e\u0000\u0000\u0116"+
|
||||
"\u0117\u0005t\u0000\u0000\u0117\u0118\u0005w\u0000\u0000\u0118\u0119\u0005"+
|
||||
"e\u0000\u0000\u0119\u011a\u0005e\u0000\u0000\u011a\u011b\u0005n\u0000"+
|
||||
"\u0000\u011b2\u0001\u0000\u0000\u0000\u011c\u011d\u0005t\u0000\u0000\u011d"+
|
||||
"\u011e\u0005o\u0000\u0000\u011e4\u0001\u0000\u0000\u0000\u011f\u0120\u0005"+
|
||||
"i\u0000\u0000\u0120\u0121\u0005n\u0000\u0000\u0121\u0122\u0005r\u0000"+
|
||||
"\u0000\u0122\u0123\u0005a\u0000\u0000\u0123\u0124\u0005n\u0000\u0000\u0124"+
|
||||
"\u0125\u0005g\u0000\u0000\u0125\u0126\u0005e\u0000\u0000\u01266\u0001"+
|
||||
"\u0000\u0000\u0000\u0127\u0128\u0005i\u0000\u0000\u0128\u0129\u0005n\u0000"+
|
||||
"\u0000\u0129\u012a\u0005R\u0000\u0000\u012a\u012b\u0005a\u0000\u0000\u012b"+
|
||||
"\u012c\u0005n\u0000\u0000\u012c\u012d\u0005g\u0000\u0000\u012d\u012e\u0005"+
|
||||
"e\u0000\u0000\u012e8\u0001\u0000\u0000\u0000\u012f\u0130\u0005i\u0000"+
|
||||
"\u0000\u0130\u0131\u0005s\u0000\u0000\u0131:\u0001\u0000\u0000\u0000\u0132"+
|
||||
"\u0133\u0005n\u0000\u0000\u0133\u0134\u0005u\u0000\u0000\u0134\u0135\u0005"+
|
||||
"l\u0000\u0000\u0135\u0136\u0005l\u0000\u0000\u0136<\u0001\u0000\u0000"+
|
||||
"\u0000\u0137\u0138\u0005i\u0000\u0000\u0138\u0139\u0005s\u0000\u0000\u0139"+
|
||||
"\u013a\u0005N\u0000\u0000\u013a\u013b\u0005u\u0000\u0000\u013b\u013c\u0005"+
|
||||
"l\u0000\u0000\u013c\u013d\u0005l\u0000\u0000\u013d>\u0001\u0000\u0000"+
|
||||
"\u0000\u013e\u013f\u0005i\u0000\u0000\u013f\u0140\u0005s\u0000\u0000\u0140"+
|
||||
"\u0141\u0005N\u0000\u0000\u0141\u0142\u0005o\u0000\u0000\u0142\u0143\u0005"+
|
||||
"t\u0000\u0000\u0143\u0144\u0005N\u0000\u0000\u0144\u0145\u0005u\u0000"+
|
||||
"\u0000\u0145\u0146\u0005l\u0000\u0000\u0146\u0147\u0005l\u0000\u0000\u0147"+
|
||||
"@\u0001\u0000\u0000\u0000\u0148\u0149\u0005n\u0000\u0000\u0149\u014a\u0005"+
|
||||
"o\u0000\u0000\u014a\u014b\u0005t\u0000\u0000\u014b\u014c\u0005N\u0000"+
|
||||
"\u0000\u014c\u014d\u0005u\u0000\u0000\u014d\u014e\u0005l\u0000\u0000\u014e"+
|
||||
"\u014f\u0005l\u0000\u0000\u014fB\u0001\u0000\u0000\u0000\u0150\u0151\u0005"+
|
||||
"e\u0000\u0000\u0151\u0152\u0005m\u0000\u0000\u0152\u0153\u0005p\u0000"+
|
||||
"\u0000\u0153\u0154\u0005t\u0000\u0000\u0154\u0155\u0005y\u0000\u0000\u0155"+
|
||||
"D\u0001\u0000\u0000\u0000\u0156\u0157\u0005i\u0000\u0000\u0157\u0158\u0005"+
|
||||
"s\u0000\u0000\u0158\u0159\u0005E\u0000\u0000\u0159\u015a\u0005m\u0000"+
|
||||
"\u0000\u015a\u015b\u0005p\u0000\u0000\u015b\u015c\u0005t\u0000\u0000\u015c"+
|
||||
"\u015d\u0005y\u0000\u0000\u015dF\u0001\u0000\u0000\u0000\u015e\u015f\u0005"+
|
||||
"i\u0000\u0000\u015f\u0160\u0005s\u0000\u0000\u0160\u0161\u0005N\u0000"+
|
||||
"\u0000\u0161\u0162\u0005o\u0000\u0000\u0162\u0163\u0005t\u0000\u0000\u0163"+
|
||||
"\u0164\u0005E\u0000\u0000\u0164\u0165\u0005m\u0000\u0000\u0165\u0166\u0005"+
|
||||
"p\u0000\u0000\u0166\u0167\u0005t\u0000\u0000\u0167\u0168\u0005y\u0000"+
|
||||
"\u0000\u0168H\u0001\u0000\u0000\u0000\u0169\u016a\u0005n\u0000\u0000\u016a"+
|
||||
"\u016b\u0005o\u0000\u0000\u016b\u016c\u0005t\u0000\u0000\u016c\u016d\u0005"+
|
||||
"E\u0000\u0000\u016d\u016e\u0005m\u0000\u0000\u016e\u016f\u0005p\u0000"+
|
||||
"\u0000\u016f\u0170\u0005t\u0000\u0000\u0170\u0171\u0005y\u0000\u0000\u0171"+
|
||||
"J\u0001\u0000\u0000\u0000\u0172\u0173\u0005l\u0000\u0000\u0173\u0174\u0005"+
|
||||
"i\u0000\u0000\u0174\u0175\u0005k\u0000\u0000\u0175\u0176\u0005e\u0000"+
|
||||
"\u0000\u0176L\u0001\u0000\u0000\u0000\u0177\u0178\u0005i\u0000\u0000\u0178"+
|
||||
"\u0179\u0005l\u0000\u0000\u0179\u017a\u0005i\u0000\u0000\u017a\u017b\u0005"+
|
||||
"k\u0000\u0000\u017b\u017c\u0005e\u0000\u0000\u017cN\u0001\u0000\u0000"+
|
||||
"\u0000\u017d\u017e\u0005c\u0000\u0000\u017e\u017f\u0005o\u0000\u0000\u017f"+
|
||||
"\u0180\u0005n\u0000\u0000\u0180\u0181\u0005t\u0000\u0000\u0181\u0182\u0005"+
|
||||
"a\u0000\u0000\u0182\u0183\u0005i\u0000\u0000\u0183\u0184\u0005n\u0000"+
|
||||
"\u0000\u0184\u0185\u0005s\u0000\u0000\u0185P\u0001\u0000\u0000\u0000\u0186"+
|
||||
"\u0187\u0005i\u0000\u0000\u0187\u0188\u0005c\u0000\u0000\u0188\u0189\u0005"+
|
||||
"o\u0000\u0000\u0189\u018a\u0005n\u0000\u0000\u018a\u018b\u0005t\u0000"+
|
||||
"\u0000\u018b\u018c\u0005a\u0000\u0000\u018c\u018d\u0005i\u0000\u0000\u018d"+
|
||||
"\u018e\u0005n\u0000\u0000\u018e\u018f\u0005s\u0000\u0000\u018fR\u0001"+
|
||||
"\u0000\u0000\u0000\u0190\u0191\u0005s\u0000\u0000\u0191\u0192\u0005t\u0000"+
|
||||
"\u0000\u0192\u0193\u0005a\u0000\u0000\u0193\u0194\u0005r\u0000\u0000\u0194"+
|
||||
"\u0195\u0005t\u0000\u0000\u0195\u0196\u0005s\u0000\u0000\u0196\u0197\u0005"+
|
||||
"W\u0000\u0000\u0197\u0198\u0005i\u0000\u0000\u0198\u0199\u0005t\u0000"+
|
||||
"\u0000\u0199\u019a\u0005h\u0000\u0000\u019aT\u0001\u0000\u0000\u0000\u019b"+
|
||||
"\u019c\u0005i\u0000\u0000\u019c\u019d\u0005s\u0000\u0000\u019d\u019e\u0005"+
|
||||
"t\u0000\u0000\u019e\u019f\u0005a\u0000\u0000\u019f\u01a0\u0005r\u0000"+
|
||||
"\u0000\u01a0\u01a1\u0005t\u0000\u0000\u01a1\u01a2\u0005s\u0000\u0000\u01a2"+
|
||||
"\u01a3\u0005W\u0000\u0000\u01a3\u01a4\u0005i\u0000\u0000\u01a4\u01a5\u0005"+
|
||||
"t\u0000\u0000\u01a5\u01a6\u0005h\u0000\u0000\u01a6V\u0001\u0000\u0000"+
|
||||
"\u0000\u01a7\u01a8\u0005e\u0000\u0000\u01a8\u01a9\u0005n\u0000\u0000\u01a9"+
|
||||
"\u01aa\u0005d\u0000\u0000\u01aa\u01ab\u0005s\u0000\u0000\u01ab\u01ac\u0005"+
|
||||
"W\u0000\u0000\u01ac\u01ad\u0005i\u0000\u0000\u01ad\u01ae\u0005t\u0000"+
|
||||
"\u0000\u01ae\u01af\u0005h\u0000\u0000\u01afX\u0001\u0000\u0000\u0000\u01b0"+
|
||||
"\u01b1\u0005i\u0000\u0000\u01b1\u01b2\u0005e\u0000\u0000\u01b2\u01b3\u0005"+
|
||||
"n\u0000\u0000\u01b3\u01b4\u0005d\u0000\u0000\u01b4\u01b5\u0005s\u0000"+
|
||||
"\u0000\u01b5\u01b6\u0005W\u0000\u0000\u01b6\u01b7\u0005i\u0000\u0000\u01b7"+
|
||||
"\u01b8\u0005t\u0000\u0000\u01b8\u01b9\u0005h\u0000\u0000\u01b9Z\u0001"+
|
||||
"\u0000\u0000\u0000\u01ba\u01bb\u0005=\u0000\u0000\u01bb\\\u0001\u0000"+
|
||||
"\u0000\u0000\u01bc\u01bd\u0005e\u0000\u0000\u01bd\u01be\u0005q\u0000\u0000"+
|
||||
"\u01be^\u0001\u0000\u0000\u0000\u01bf\u01c0\u0005>\u0000\u0000\u01c0`"+
|
||||
"\u0001\u0000\u0000\u0000\u01c1\u01c2\u0005g\u0000\u0000\u01c2\u01c3\u0005"+
|
||||
"t\u0000\u0000\u01c3b\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005>\u0000"+
|
||||
"\u0000\u01c5\u01c6\u0005=\u0000\u0000\u01c6d\u0001\u0000\u0000\u0000\u01c7"+
|
||||
"\u01c8\u0005g\u0000\u0000\u01c8\u01c9\u0005e\u0000\u0000\u01c9f\u0001"+
|
||||
"\u0000\u0000\u0000\u01ca\u01cb\u0005g\u0000\u0000\u01cb\u01cc\u0005t\u0000"+
|
||||
"\u0000\u01cc\u01cd\u0005e\u0000\u0000\u01cdh\u0001\u0000\u0000\u0000\u01ce"+
|
||||
"\u01cf\u0005<\u0000\u0000\u01cfj\u0001\u0000\u0000\u0000\u01d0\u01d1\u0005"+
|
||||
"l\u0000\u0000\u01d1\u01d2\u0005t\u0000\u0000\u01d2l\u0001\u0000\u0000"+
|
||||
"\u0000\u01d3\u01d4\u0005<\u0000\u0000\u01d4\u01d5\u0005=\u0000\u0000\u01d5"+
|
||||
"n\u0001\u0000\u0000\u0000\u01d6\u01d7\u0005l\u0000\u0000\u01d7\u01d8\u0005"+
|
||||
"e\u0000\u0000\u01d8p\u0001\u0000\u0000\u0000\u01d9\u01da\u0005l\u0000"+
|
||||
"\u0000\u01da\u01db\u0005t\u0000\u0000\u01db\u01dc\u0005e\u0000\u0000\u01dc"+
|
||||
"r\u0001\u0000\u0000\u0000\u01dd\u01de\u0005<\u0000\u0000\u01de\u01df\u0005"+
|
||||
">\u0000\u0000\u01dft\u0001\u0000\u0000\u0000\u01e0\u01e1\u0005!\u0000"+
|
||||
"\u0000\u01e1\u01e2\u0005=\u0000\u0000\u01e2v\u0001\u0000\u0000\u0000\u01e3"+
|
||||
"\u01e4\u0005n\u0000\u0000\u01e4\u01e5\u0005e\u0000\u0000\u01e5x\u0001"+
|
||||
"\u0000\u0000\u0000\u01e6\u01e7\u0005i\u0000\u0000\u01e7\u01e8\u0005e\u0000"+
|
||||
"\u0000\u01e8\u01e9\u0005q\u0000\u0000\u01e9z\u0001\u0000\u0000\u0000\u01ea"+
|
||||
"\u01eb\u0005i\u0000\u0000\u01eb\u01ec\u0005n\u0000\u0000\u01ec\u01ed\u0005"+
|
||||
"e\u0000\u0000\u01ed|\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005e\u0000"+
|
||||
"\u0000\u01ef\u01f0\u0005q\u0000\u0000\u01f0\u01f1\u0005O\u0000\u0000\u01f1"+
|
||||
"\u01f2\u0005r\u0000\u0000\u01f2\u01f3\u0005N\u0000\u0000\u01f3\u01f4\u0005"+
|
||||
"u\u0000\u0000\u01f4\u01f5\u0005l\u0000\u0000\u01f5\u01f6\u0005l\u0000"+
|
||||
"\u0000\u01f6~\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005g\u0000\u0000\u01f8"+
|
||||
"\u01f9\u0005t\u0000\u0000\u01f9\u01fa\u0005O\u0000\u0000\u01fa\u01fb\u0005"+
|
||||
"r\u0000\u0000\u01fb\u01fc\u0005N\u0000\u0000\u01fc\u01fd\u0005u\u0000"+
|
||||
"\u0000\u01fd\u01fe\u0005l\u0000\u0000\u01fe\u01ff\u0005l\u0000\u0000\u01ff"+
|
||||
"\u0080\u0001\u0000\u0000\u0000\u0200\u0201\u0005l\u0000\u0000\u0201\u0202"+
|
||||
"\u0005t\u0000\u0000\u0202\u0203\u0005O\u0000\u0000\u0203\u0204\u0005r"+
|
||||
"\u0000\u0000\u0204\u0205\u0005N\u0000\u0000\u0205\u0206\u0005u\u0000\u0000"+
|
||||
"\u0206\u0207\u0005l\u0000\u0000\u0207\u0208\u0005l\u0000\u0000\u0208\u0082"+
|
||||
"\u0001\u0000\u0000\u0000\u0209\u020a\u0005g\u0000\u0000\u020a\u020b\u0005"+
|
||||
"e\u0000\u0000\u020b\u020c\u0005O\u0000\u0000\u020c\u020d\u0005r\u0000"+
|
||||
"\u0000\u020d\u020e\u0005N\u0000\u0000\u020e\u020f\u0005u\u0000\u0000\u020f"+
|
||||
"\u0210\u0005l\u0000\u0000\u0210\u0211\u0005l\u0000\u0000\u0211\u0084\u0001"+
|
||||
"\u0000\u0000\u0000\u0212\u0213\u0005l\u0000\u0000\u0213\u0214\u0005e\u0000"+
|
||||
"\u0000\u0214\u0215\u0005O\u0000\u0000\u0215\u0216\u0005r\u0000\u0000\u0216"+
|
||||
"\u0217\u0005N\u0000\u0000\u0217\u0218\u0005u\u0000\u0000\u0218\u0219\u0005"+
|
||||
"l\u0000\u0000\u0219\u021a\u0005l\u0000\u0000\u021a\u0086\u0001\u0000\u0000"+
|
||||
"\u0000\u021b\u021c\u0005:\u0000\u0000\u021c\u0220\u0007\u0000\u0000\u0000"+
|
||||
"\u021d\u021f\u0007\u0001\u0000\u0000\u021e\u021d\u0001\u0000\u0000\u0000"+
|
||||
"\u021f\u0222\u0001\u0000\u0000\u0000\u0220\u021e\u0001\u0000\u0000\u0000"+
|
||||
"\u0220\u0221\u0001\u0000\u0000\u0000\u0221\u022b\u0001\u0000\u0000\u0000"+
|
||||
"\u0222\u0220\u0001\u0000\u0000\u0000\u0223\u0227\u0005?\u0000\u0000\u0224"+
|
||||
"\u0226\u000209\u0000\u0225\u0224\u0001\u0000\u0000\u0000\u0226\u0229\u0001"+
|
||||
"\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228\u0001"+
|
||||
"\u0000\u0000\u0000\u0228\u022b\u0001\u0000\u0000\u0000\u0229\u0227\u0001"+
|
||||
"\u0000\u0000\u0000\u022a\u021b\u0001\u0000\u0000\u0000\u022a\u0223\u0001"+
|
||||
"\u0000\u0000\u0000\u022b\u0088\u0001\u0000\u0000\u0000\u022c\u0230\u0007"+
|
||||
"\u0000\u0000\u0000\u022d\u022f\u0007\u0002\u0000\u0000\u022e\u022d\u0001"+
|
||||
"\u0000\u0000\u0000\u022f\u0232\u0001\u0000\u0000\u0000\u0230\u022e\u0001"+
|
||||
"\u0000\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000\u0231\u008a\u0001"+
|
||||
"\u0000\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0233\u0234\u0005"+
|
||||
"`\u0000\u0000\u0234\u0235\u0003\u0089D\u0000\u0235\u0236\u0005`\u0000"+
|
||||
"\u0000\u0236\u008c\u0001\u0000\u0000\u0000\u0237\u0238\u0005s\u0000\u0000"+
|
||||
"\u0238\u0239\u0005u\u0000\u0000\u0239\u023a\u0005m\u0000\u0000\u023a\u023b"+
|
||||
"\u0005(\u0000\u0000\u023b\u023c\u0001\u0000\u0000\u0000\u023c\u023d\u0003"+
|
||||
"\u0089D\u0000\u023d\u023e\u0005)\u0000\u0000\u023e\u0262\u0001\u0000\u0000"+
|
||||
"\u0000\u023f\u0240\u0005m\u0000\u0000\u0240\u0241\u0005a\u0000\u0000\u0241"+
|
||||
"\u0242\u0005x\u0000\u0000\u0242\u0243\u0005(\u0000\u0000\u0243\u0244\u0001"+
|
||||
"\u0000\u0000\u0000\u0244\u0245\u0003\u0089D\u0000\u0245\u0246\u0005)\u0000"+
|
||||
"\u0000\u0246\u0262\u0001\u0000\u0000\u0000\u0247\u0248\u0005m\u0000\u0000"+
|
||||
"\u0248\u0249\u0005i\u0000\u0000\u0249\u024a\u0005n\u0000\u0000\u024a\u024b"+
|
||||
"\u0005(\u0000\u0000\u024b\u024c\u0001\u0000\u0000\u0000\u024c\u024d\u0003"+
|
||||
"\u0089D\u0000\u024d\u024e\u0005)\u0000\u0000\u024e\u0262\u0001\u0000\u0000"+
|
||||
"\u0000\u024f\u0250\u0005a\u0000\u0000\u0250\u0251\u0005v\u0000\u0000\u0251"+
|
||||
"\u0252\u0005g\u0000\u0000\u0252\u0253\u0005(\u0000\u0000\u0253\u0254\u0001"+
|
||||
"\u0000\u0000\u0000\u0254\u0255\u0003\u0089D\u0000\u0255\u0256\u0005)\u0000"+
|
||||
"\u0000\u0256\u0262\u0001\u0000\u0000\u0000\u0257\u0258\u0005c\u0000\u0000"+
|
||||
"\u0258\u0259\u0005o\u0000\u0000\u0259\u025a\u0005u\u0000\u0000\u025a\u025b"+
|
||||
"\u0005n\u0000\u0000\u025b\u025c\u0005t\u0000\u0000\u025c\u025d\u0005("+
|
||||
"\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025f\u0003\u0089"+
|
||||
"D\u0000\u025f\u0260\u0005)\u0000\u0000\u0260\u0262\u0001\u0000\u0000\u0000"+
|
||||
"\u0261\u0237\u0001\u0000\u0000\u0000\u0261\u023f\u0001\u0000\u0000\u0000"+
|
||||
"\u0261\u0247\u0001\u0000\u0000\u0000\u0261\u024f\u0001\u0000\u0000\u0000"+
|
||||
"\u0261\u0257\u0001\u0000\u0000\u0000\u0262\u008e\u0001\u0000\u0000\u0000"+
|
||||
"\u0263\u0264\u0005t\u0000\u0000\u0264\u0265\u0005r\u0000\u0000\u0265\u0266"+
|
||||
"\u0005u\u0000\u0000\u0266\u026d\u0005e\u0000\u0000\u0267\u0268\u0005f"+
|
||||
"\u0000\u0000\u0268\u0269\u0005a\u0000\u0000\u0269\u026a\u0005l\u0000\u0000"+
|
||||
"\u026a\u026b\u0005s\u0000\u0000\u026b\u026d\u0005e\u0000\u0000\u026c\u0263"+
|
||||
"\u0001\u0000\u0000\u0000\u026c\u0267\u0001\u0000\u0000\u0000\u026d\u0090"+
|
||||
"\u0001\u0000\u0000\u0000\u026e\u0270\u0005-\u0000\u0000\u026f\u026e\u0001"+
|
||||
"\u0000\u0000\u0000\u026f\u0270\u0001\u0000\u0000\u0000\u0270\u0271\u0001"+
|
||||
"\u0000\u0000\u0000\u0271\u0278\u0003\u0093I\u0000\u0272\u0274\u0005-\u0000"+
|
||||
"\u0000\u0273\u0272\u0001\u0000\u0000\u0000\u0273\u0274\u0001\u0000\u0000"+
|
||||
"\u0000\u0274\u0275\u0001\u0000\u0000\u0000\u0275\u0278\u0003\u0095J\u0000"+
|
||||
"\u0276\u0278\u0003\u0097K\u0000\u0277\u026f\u0001\u0000\u0000\u0000\u0277"+
|
||||
"\u0273\u0001\u0000\u0000\u0000\u0277\u0276\u0001\u0000\u0000\u0000\u0278"+
|
||||
"\u0092\u0001\u0000\u0000\u0000\u0279\u027b\u0007\u0003\u0000\u0000\u027a"+
|
||||
"\u0279\u0001\u0000\u0000\u0000\u027b\u027c\u0001\u0000\u0000\u0000\u027c"+
|
||||
"\u027a\u0001\u0000\u0000\u0000\u027c\u027d\u0001\u0000\u0000\u0000\u027d"+
|
||||
"\u027e\u0001\u0000\u0000\u0000\u027e\u0282\u0005.\u0000\u0000\u027f\u0281"+
|
||||
"\u0007\u0003\u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000\u0281\u0284"+
|
||||
"\u0001\u0000\u0000\u0000\u0282\u0280\u0001\u0000\u0000\u0000\u0282\u0283"+
|
||||
"\u0001\u0000\u0000\u0000\u0283\u0094\u0001\u0000\u0000\u0000\u0284\u0282"+
|
||||
"\u0001\u0000\u0000\u0000\u0285\u0289\u0007\u0004\u0000\u0000\u0286\u0288"+
|
||||
"\u0007\u0003\u0000\u0000\u0287\u0286\u0001\u0000\u0000\u0000\u0288\u028b"+
|
||||
"\u0001\u0000\u0000\u0000\u0289\u0287\u0001\u0000\u0000\u0000\u0289\u028a"+
|
||||
"\u0001\u0000\u0000\u0000\u028a\u0096\u0001\u0000\u0000\u0000\u028b\u0289"+
|
||||
"\u0001\u0000\u0000\u0000\u028c\u028d\u00050\u0000\u0000\u028d\u0098\u0001"+
|
||||
"\u0000\u0000\u0000\u028e\u0294\u0005\'\u0000\u0000\u028f\u0293\b\u0005"+
|
||||
"\u0000\u0000\u0290\u0291\u0005\'\u0000\u0000\u0291\u0293\u0005\'\u0000"+
|
||||
"\u0000\u0292\u028f\u0001\u0000\u0000\u0000\u0292\u0290\u0001\u0000\u0000"+
|
||||
"\u0000\u0293\u0296\u0001\u0000\u0000\u0000\u0294\u0292\u0001\u0000\u0000"+
|
||||
"\u0000\u0294\u0295\u0001\u0000\u0000\u0000\u0295\u0297\u0001\u0000\u0000"+
|
||||
"\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0297\u0298\u0005\'\u0000\u0000"+
|
||||
"\u0298\u009a\u0001\u0000\u0000\u0000\u0299\u029a\u0007\u0006\u0000\u0000"+
|
||||
"\u029a\u029b\u0001\u0000\u0000\u0000\u029b\u029c\u0006M\u0000\u0000\u029c"+
|
||||
"\u009c\u0001\u0000\u0000\u0000\u000f\u0000\u0220\u0227\u022a\u0230\u0261"+
|
||||
"\u026c\u026f\u0273\u0277\u027c\u0282\u0289\u0292\u0294\u0001\u0006\u0000"+
|
||||
"\u0000";
|
||||
public static final ATN _ATN =
|
||||
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
|
||||
static {
|
||||
@@ -371,4 +546,4 @@ public class EQLLexer extends Lexer {
|
||||
_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Generated from /home/rob/github/ebean-dir/ebean/src/test/resources/EQL.g4 by ANTLR 4.8
|
||||
// Generated from /Users/robinbygrave/Documents/github/ebean/ebean/ebean-test/src/test/resources/EQL.g4 by ANTLR 4.13.1
|
||||
package io.ebeaninternal.server.grammer.antlr;
|
||||
import org.antlr.v4.runtime.tree.ParseTreeListener;
|
||||
|
||||
|
||||
@@ -1,74 +1,62 @@
|
||||
// Generated from /home/rob/github/ebean-dir/ebean/src/test/resources/EQL.g4 by ANTLR 4.8
|
||||
// Generated from /Users/robinbygrave/Documents/github/ebean/ebean/ebean-test/src/test/resources/EQL.g4 by ANTLR 4.13.1
|
||||
package io.ebeaninternal.server.grammer.antlr;
|
||||
|
||||
import org.antlr.v4.runtime.NoViableAltException;
|
||||
import org.antlr.v4.runtime.Parser;
|
||||
import org.antlr.v4.runtime.ParserRuleContext;
|
||||
import org.antlr.v4.runtime.RecognitionException;
|
||||
import org.antlr.v4.runtime.RuntimeMetaData;
|
||||
import org.antlr.v4.runtime.Token;
|
||||
import org.antlr.v4.runtime.TokenStream;
|
||||
import org.antlr.v4.runtime.Vocabulary;
|
||||
import org.antlr.v4.runtime.VocabularyImpl;
|
||||
import org.antlr.v4.runtime.atn.ATN;
|
||||
import org.antlr.v4.runtime.atn.ATNDeserializer;
|
||||
import org.antlr.v4.runtime.atn.ParserATNSimulator;
|
||||
import org.antlr.v4.runtime.atn.PredictionContextCache;
|
||||
import org.antlr.v4.runtime.atn.*;
|
||||
import org.antlr.v4.runtime.dfa.DFA;
|
||||
import org.antlr.v4.runtime.tree.ParseTreeListener;
|
||||
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
|
||||
import org.antlr.v4.runtime.tree.TerminalNode;
|
||||
|
||||
import org.antlr.v4.runtime.*;
|
||||
import org.antlr.v4.runtime.misc.*;
|
||||
import org.antlr.v4.runtime.tree.*;
|
||||
import java.util.List;
|
||||
import java.util.Iterator;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
|
||||
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"})
|
||||
public class EQLParser extends Parser {
|
||||
static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); }
|
||||
static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); }
|
||||
|
||||
protected static final DFA[] _decisionToDFA;
|
||||
protected static final PredictionContextCache _sharedContextCache =
|
||||
new PredictionContextCache();
|
||||
public static final int
|
||||
T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
|
||||
T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
|
||||
T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
|
||||
T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
|
||||
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
|
||||
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
|
||||
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
|
||||
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
|
||||
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
|
||||
T__66=67, INPUT_VARIABLE=68, PATH_VARIABLE=69, QUOTED_PATH_VARIABLE=70,
|
||||
PROP_FORMULA=71, BOOLEAN_LITERAL=72, NUMBER_LITERAL=73, DOUBLE=74, INT=75,
|
||||
T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
|
||||
T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
|
||||
T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
|
||||
T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
|
||||
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
|
||||
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
|
||||
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
|
||||
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
|
||||
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
|
||||
T__66=67, INPUT_VARIABLE=68, PATH_VARIABLE=69, QUOTED_PATH_VARIABLE=70,
|
||||
PROP_FORMULA=71, BOOLEAN_LITERAL=72, NUMBER_LITERAL=73, DOUBLE=74, INT=75,
|
||||
ZERO=76, STRING_LITERAL=77, WS=78;
|
||||
public static final int
|
||||
RULE_select_statement = 0, RULE_select_properties = 1, RULE_select_clause = 2,
|
||||
RULE_distinct = 3, RULE_fetch_clause = 4, RULE_where_clause = 5, RULE_orderby_clause = 6,
|
||||
RULE_orderby_property = 7, RULE_nulls_firstlast = 8, RULE_asc_desc = 9,
|
||||
RULE_limit_clause = 10, RULE_offset_clause = 11, RULE_fetch_path = 12,
|
||||
RULE_fetch_property_set = 13, RULE_fetch_property_group = 14, RULE_fetch_path_path = 15,
|
||||
RULE_fetch_property = 16, RULE_fetch_query_hint = 17, RULE_fetch_lazy_hint = 18,
|
||||
RULE_fetch_option = 19, RULE_fetch_query_option = 20, RULE_fetch_lazy_option = 21,
|
||||
RULE_fetch_batch_size = 22, RULE_conditional_expression = 23, RULE_conditional_term = 24,
|
||||
RULE_conditional_factor = 25, RULE_conditional_primary = 26, RULE_any_expression = 27,
|
||||
RULE_inOrEmpty_expression = 28, RULE_in_expression = 29, RULE_in_value = 30,
|
||||
RULE_between_expression = 31, RULE_inrange_expression = 32, RULE_inrange_op = 33,
|
||||
RULE_propertyBetween_expression = 34, RULE_isNull_expression = 35, RULE_isNotNull_expression = 36,
|
||||
RULE_isEmpty_expression = 37, RULE_isNotEmpty_expression = 38, RULE_like_expression = 39,
|
||||
RULE_like_op = 40, RULE_comparison_expression = 41, RULE_comparison_operator = 42,
|
||||
RULE_select_statement = 0, RULE_select_properties = 1, RULE_select_clause = 2,
|
||||
RULE_distinct = 3, RULE_fetch_clause = 4, RULE_where_clause = 5, RULE_orderby_clause = 6,
|
||||
RULE_orderby_property = 7, RULE_nulls_firstlast = 8, RULE_asc_desc = 9,
|
||||
RULE_limit_clause = 10, RULE_offset_clause = 11, RULE_fetch_path = 12,
|
||||
RULE_fetch_property_set = 13, RULE_fetch_property_group = 14, RULE_fetch_path_path = 15,
|
||||
RULE_fetch_property = 16, RULE_fetch_query_hint = 17, RULE_fetch_lazy_hint = 18,
|
||||
RULE_fetch_option = 19, RULE_fetch_query_option = 20, RULE_fetch_lazy_option = 21,
|
||||
RULE_fetch_batch_size = 22, RULE_conditional_expression = 23, RULE_conditional_term = 24,
|
||||
RULE_conditional_factor = 25, RULE_conditional_primary = 26, RULE_any_expression = 27,
|
||||
RULE_inOrEmpty_expression = 28, RULE_in_expression = 29, RULE_in_value = 30,
|
||||
RULE_between_expression = 31, RULE_inrange_expression = 32, RULE_inrange_op = 33,
|
||||
RULE_propertyBetween_expression = 34, RULE_isNull_expression = 35, RULE_isNotNull_expression = 36,
|
||||
RULE_isEmpty_expression = 37, RULE_isNotEmpty_expression = 38, RULE_like_expression = 39,
|
||||
RULE_like_op = 40, RULE_comparison_expression = 41, RULE_comparison_operator = 42,
|
||||
RULE_value_expression = 43, RULE_literal = 44;
|
||||
private static String[] makeRuleNames() {
|
||||
return new String[] {
|
||||
"select_statement", "select_properties", "select_clause", "distinct",
|
||||
"fetch_clause", "where_clause", "orderby_clause", "orderby_property",
|
||||
"nulls_firstlast", "asc_desc", "limit_clause", "offset_clause", "fetch_path",
|
||||
"fetch_property_set", "fetch_property_group", "fetch_path_path", "fetch_property",
|
||||
"fetch_query_hint", "fetch_lazy_hint", "fetch_option", "fetch_query_option",
|
||||
"fetch_lazy_option", "fetch_batch_size", "conditional_expression", "conditional_term",
|
||||
"conditional_factor", "conditional_primary", "any_expression", "inOrEmpty_expression",
|
||||
"in_expression", "in_value", "between_expression", "inrange_expression",
|
||||
"inrange_op", "propertyBetween_expression", "isNull_expression", "isNotNull_expression",
|
||||
"isEmpty_expression", "isNotEmpty_expression", "like_expression", "like_op",
|
||||
"select_statement", "select_properties", "select_clause", "distinct",
|
||||
"fetch_clause", "where_clause", "orderby_clause", "orderby_property",
|
||||
"nulls_firstlast", "asc_desc", "limit_clause", "offset_clause", "fetch_path",
|
||||
"fetch_property_set", "fetch_property_group", "fetch_path_path", "fetch_property",
|
||||
"fetch_query_hint", "fetch_lazy_hint", "fetch_option", "fetch_query_option",
|
||||
"fetch_lazy_option", "fetch_batch_size", "conditional_expression", "conditional_term",
|
||||
"conditional_factor", "conditional_primary", "any_expression", "inOrEmpty_expression",
|
||||
"in_expression", "in_value", "between_expression", "inrange_expression",
|
||||
"inrange_op", "propertyBetween_expression", "isNull_expression", "isNotNull_expression",
|
||||
"isEmpty_expression", "isNotEmpty_expression", "like_expression", "like_op",
|
||||
"comparison_expression", "comparison_operator", "value_expression", "literal"
|
||||
};
|
||||
}
|
||||
@@ -76,29 +64,29 @@ public class EQLParser extends Parser {
|
||||
|
||||
private static String[] makeLiteralNames() {
|
||||
return new String[] {
|
||||
null, "'('", "')'", "'select'", "'distinct'", "'where'", "'order'", "'by'",
|
||||
"','", "'nulls'", "'first'", "'last'", "'asc'", "'desc'", "'limit'",
|
||||
"'offset'", "'fetch'", "'+'", "'query'", "'lazy'", "'or'", "'and'", "'not'",
|
||||
"'inOrEmpty'", "'in'", "'between'", "'to'", "'inrange'", "'inRange'",
|
||||
"'is'", "'null'", "'isNull'", "'isNotNull'", "'notNull'", "'empty'",
|
||||
"'isEmpty'", "'isNotEmpty'", "'notEmpty'", "'like'", "'ilike'", "'contains'",
|
||||
"'icontains'", "'startsWith'", "'istartsWith'", "'endsWith'", "'iendsWith'",
|
||||
"'='", "'eq'", "'>'", "'gt'", "'>='", "'ge'", "'gte'", "'<'", "'lt'",
|
||||
"'<='", "'le'", "'lte'", "'<>'", "'!='", "'ne'", "'ieq'", "'ine'", "'eqOrNull'",
|
||||
"'gtOrNull'", "'ltOrNull'", "'geOrNull'", "'leOrNull'", null, null, null,
|
||||
null, "'('", "')'", "'select'", "'distinct'", "'where'", "'order'", "'by'",
|
||||
"','", "'nulls'", "'first'", "'last'", "'asc'", "'desc'", "'limit'",
|
||||
"'offset'", "'fetch'", "'+'", "'query'", "'lazy'", "'or'", "'and'", "'not'",
|
||||
"'inOrEmpty'", "'in'", "'between'", "'to'", "'inrange'", "'inRange'",
|
||||
"'is'", "'null'", "'isNull'", "'isNotNull'", "'notNull'", "'empty'",
|
||||
"'isEmpty'", "'isNotEmpty'", "'notEmpty'", "'like'", "'ilike'", "'contains'",
|
||||
"'icontains'", "'startsWith'", "'istartsWith'", "'endsWith'", "'iendsWith'",
|
||||
"'='", "'eq'", "'>'", "'gt'", "'>='", "'ge'", "'gte'", "'<'", "'lt'",
|
||||
"'<='", "'le'", "'lte'", "'<>'", "'!='", "'ne'", "'ieq'", "'ine'", "'eqOrNull'",
|
||||
"'gtOrNull'", "'ltOrNull'", "'geOrNull'", "'leOrNull'", null, null, null,
|
||||
null, null, null, null, null, "'0'"
|
||||
};
|
||||
}
|
||||
private static final String[] _LITERAL_NAMES = makeLiteralNames();
|
||||
private static String[] makeSymbolicNames() {
|
||||
return new String[] {
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, "INPUT_VARIABLE", "PATH_VARIABLE",
|
||||
"QUOTED_PATH_VARIABLE", "PROP_FORMULA", "BOOLEAN_LITERAL", "NUMBER_LITERAL",
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, "INPUT_VARIABLE", "PATH_VARIABLE",
|
||||
"QUOTED_PATH_VARIABLE", "PROP_FORMULA", "BOOLEAN_LITERAL", "NUMBER_LITERAL",
|
||||
"DOUBLE", "INT", "ZERO", "STRING_LITERAL", "WS"
|
||||
};
|
||||
}
|
||||
@@ -153,6 +141,7 @@ public class EQLParser extends Parser {
|
||||
_interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Select_statementContext extends ParserRuleContext {
|
||||
public TerminalNode EOF() { return getToken(EQLParser.EOF, 0); }
|
||||
public Select_clauseContext select_clause() {
|
||||
@@ -268,6 +257,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Select_propertiesContext extends ParserRuleContext {
|
||||
public Fetch_property_groupContext fetch_property_group() {
|
||||
return getRuleContext(Fetch_property_groupContext.class,0);
|
||||
@@ -333,6 +323,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Select_clauseContext extends ParserRuleContext {
|
||||
public Select_propertiesContext select_properties() {
|
||||
return getRuleContext(Select_propertiesContext.class,0);
|
||||
@@ -393,6 +384,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class DistinctContext extends ParserRuleContext {
|
||||
public DistinctContext(ParserRuleContext parent, int invokingState) {
|
||||
super(parent, invokingState);
|
||||
@@ -434,6 +426,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_clauseContext extends ParserRuleContext {
|
||||
public Fetch_pathContext fetch_path() {
|
||||
return getRuleContext(Fetch_pathContext.class,0);
|
||||
@@ -478,6 +471,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Where_clauseContext extends ParserRuleContext {
|
||||
public Conditional_expressionContext conditional_expression() {
|
||||
return getRuleContext(Conditional_expressionContext.class,0);
|
||||
@@ -524,6 +518,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Orderby_clauseContext extends ParserRuleContext {
|
||||
public List<Orderby_propertyContext> orderby_property() {
|
||||
return getRuleContexts(Orderby_propertyContext.class);
|
||||
@@ -592,6 +587,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Orderby_propertyContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public Asc_descContext asc_desc() {
|
||||
@@ -661,6 +657,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Nulls_firstlastContext extends ParserRuleContext {
|
||||
public Nulls_firstlastContext(ParserRuleContext parent, int invokingState) {
|
||||
super(parent, invokingState);
|
||||
@@ -719,6 +716,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Asc_descContext extends ParserRuleContext {
|
||||
public Asc_descContext(ParserRuleContext parent, int invokingState) {
|
||||
super(parent, invokingState);
|
||||
@@ -769,6 +767,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Limit_clauseContext extends ParserRuleContext {
|
||||
public TerminalNode NUMBER_LITERAL() { return getToken(EQLParser.NUMBER_LITERAL, 0); }
|
||||
public Offset_clauseContext offset_clause() {
|
||||
@@ -827,6 +826,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Offset_clauseContext extends ParserRuleContext {
|
||||
public TerminalNode NUMBER_LITERAL() { return getToken(EQLParser.NUMBER_LITERAL, 0); }
|
||||
public Offset_clauseContext(ParserRuleContext parent, int invokingState) {
|
||||
@@ -871,6 +871,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_pathContext extends ParserRuleContext {
|
||||
public Fetch_path_pathContext fetch_path_path() {
|
||||
return getRuleContext(Fetch_path_pathContext.class,0);
|
||||
@@ -944,6 +945,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_property_setContext extends ParserRuleContext {
|
||||
public Fetch_property_groupContext fetch_property_group() {
|
||||
return getRuleContext(Fetch_property_groupContext.class,0);
|
||||
@@ -992,6 +994,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_property_groupContext extends ParserRuleContext {
|
||||
public List<Fetch_propertyContext> fetch_property() {
|
||||
return getRuleContexts(Fetch_propertyContext.class);
|
||||
@@ -1056,6 +1059,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_path_pathContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public TerminalNode QUOTED_PATH_VARIABLE() { return getToken(EQLParser.QUOTED_PATH_VARIABLE, 0); }
|
||||
@@ -1108,6 +1112,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_propertyContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public Fetch_query_hintContext fetch_query_hint() {
|
||||
@@ -1184,6 +1189,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_query_hintContext extends ParserRuleContext {
|
||||
public Fetch_query_optionContext fetch_query_option() {
|
||||
return getRuleContext(Fetch_query_optionContext.class,0);
|
||||
@@ -1230,6 +1236,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_lazy_hintContext extends ParserRuleContext {
|
||||
public Fetch_lazy_optionContext fetch_lazy_option() {
|
||||
return getRuleContext(Fetch_lazy_optionContext.class,0);
|
||||
@@ -1276,6 +1283,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_optionContext extends ParserRuleContext {
|
||||
public Fetch_query_optionContext fetch_query_option() {
|
||||
return getRuleContext(Fetch_query_optionContext.class,0);
|
||||
@@ -1338,6 +1346,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_query_optionContext extends ParserRuleContext {
|
||||
public Fetch_batch_sizeContext fetch_batch_size() {
|
||||
return getRuleContext(Fetch_batch_sizeContext.class,0);
|
||||
@@ -1393,6 +1402,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_lazy_optionContext extends ParserRuleContext {
|
||||
public Fetch_batch_sizeContext fetch_batch_size() {
|
||||
return getRuleContext(Fetch_batch_sizeContext.class,0);
|
||||
@@ -1448,6 +1458,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Fetch_batch_sizeContext extends ParserRuleContext {
|
||||
public TerminalNode NUMBER_LITERAL() { return getToken(EQLParser.NUMBER_LITERAL, 0); }
|
||||
public Fetch_batch_sizeContext(ParserRuleContext parent, int invokingState) {
|
||||
@@ -1494,6 +1505,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Conditional_expressionContext extends ParserRuleContext {
|
||||
public List<Conditional_termContext> conditional_term() {
|
||||
return getRuleContexts(Conditional_termContext.class);
|
||||
@@ -1558,6 +1570,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Conditional_termContext extends ParserRuleContext {
|
||||
public List<Conditional_factorContext> conditional_factor() {
|
||||
return getRuleContexts(Conditional_factorContext.class);
|
||||
@@ -1622,6 +1635,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Conditional_factorContext extends ParserRuleContext {
|
||||
public Conditional_primaryContext conditional_primary() {
|
||||
return getRuleContext(Conditional_primaryContext.class,0);
|
||||
@@ -1677,6 +1691,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Conditional_primaryContext extends ParserRuleContext {
|
||||
public Any_expressionContext any_expression() {
|
||||
return getRuleContext(Any_expressionContext.class,0);
|
||||
@@ -1741,6 +1756,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Any_expressionContext extends ParserRuleContext {
|
||||
public Comparison_expressionContext comparison_expression() {
|
||||
return getRuleContext(Comparison_expressionContext.class,0);
|
||||
@@ -1905,6 +1921,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class InOrEmpty_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public In_valueContext in_value() {
|
||||
@@ -1954,6 +1971,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class In_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public In_valueContext in_value() {
|
||||
@@ -2003,6 +2021,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class In_valueContext extends ParserRuleContext {
|
||||
public TerminalNode INPUT_VARIABLE() { return getToken(EQLParser.INPUT_VARIABLE, 0); }
|
||||
public List<Value_expressionContext> value_expression() {
|
||||
@@ -2087,6 +2106,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Between_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public List<Value_expressionContext> value_expression() {
|
||||
@@ -2143,6 +2163,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Inrange_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public Inrange_opContext inrange_op() {
|
||||
@@ -2202,6 +2223,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Inrange_opContext extends ParserRuleContext {
|
||||
public Inrange_opContext(ParserRuleContext parent, int invokingState) {
|
||||
super(parent, invokingState);
|
||||
@@ -2252,6 +2274,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class PropertyBetween_expressionContext extends ParserRuleContext {
|
||||
public Value_expressionContext value_expression() {
|
||||
return getRuleContext(Value_expressionContext.class,0);
|
||||
@@ -2308,6 +2331,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class IsNull_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public IsNull_expressionContext(ParserRuleContext parent, int invokingState) {
|
||||
@@ -2369,6 +2393,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class IsNotNull_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public IsNotNull_expressionContext(ParserRuleContext parent, int invokingState) {
|
||||
@@ -2441,6 +2466,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class IsEmpty_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public IsEmpty_expressionContext(ParserRuleContext parent, int invokingState) {
|
||||
@@ -2502,6 +2528,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class IsNotEmpty_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public IsNotEmpty_expressionContext(ParserRuleContext parent, int invokingState) {
|
||||
@@ -2574,6 +2601,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Like_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public Like_opContext like_op() {
|
||||
@@ -2626,6 +2654,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Like_opContext extends ParserRuleContext {
|
||||
public Like_opContext(ParserRuleContext parent, int invokingState) {
|
||||
super(parent, invokingState);
|
||||
@@ -2655,7 +2684,7 @@ public class EQLParser extends Parser {
|
||||
{
|
||||
setState(338);
|
||||
_la = _input.LA(1);
|
||||
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44))) != 0)) ) {
|
||||
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 70093866270720L) != 0)) ) {
|
||||
_errHandler.recoverInline(this);
|
||||
}
|
||||
else {
|
||||
@@ -2676,6 +2705,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Comparison_expressionContext extends ParserRuleContext {
|
||||
public TerminalNode PATH_VARIABLE() { return getToken(EQLParser.PATH_VARIABLE, 0); }
|
||||
public Comparison_operatorContext comparison_operator() {
|
||||
@@ -2750,6 +2780,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Comparison_operatorContext extends ParserRuleContext {
|
||||
public Comparison_operatorContext(ParserRuleContext parent, int invokingState) {
|
||||
super(parent, invokingState);
|
||||
@@ -2779,7 +2810,7 @@ public class EQLParser extends Parser {
|
||||
{
|
||||
setState(350);
|
||||
_la = _input.LA(1);
|
||||
if ( !(((((_la - 46)) & ~0x3f) == 0 && ((1L << (_la - 46)) & ((1L << (T__45 - 46)) | (1L << (T__46 - 46)) | (1L << (T__47 - 46)) | (1L << (T__48 - 46)) | (1L << (T__49 - 46)) | (1L << (T__50 - 46)) | (1L << (T__51 - 46)) | (1L << (T__52 - 46)) | (1L << (T__53 - 46)) | (1L << (T__54 - 46)) | (1L << (T__55 - 46)) | (1L << (T__56 - 46)) | (1L << (T__57 - 46)) | (1L << (T__58 - 46)) | (1L << (T__59 - 46)) | (1L << (T__60 - 46)) | (1L << (T__61 - 46)) | (1L << (T__62 - 46)) | (1L << (T__63 - 46)) | (1L << (T__64 - 46)) | (1L << (T__65 - 46)) | (1L << (T__66 - 46)))) != 0)) ) {
|
||||
if ( !(((((_la - 46)) & ~0x3f) == 0 && ((1L << (_la - 46)) & 4194303L) != 0)) ) {
|
||||
_errHandler.recoverInline(this);
|
||||
}
|
||||
else {
|
||||
@@ -2800,6 +2831,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class Value_expressionContext extends ParserRuleContext {
|
||||
public LiteralContext literal() {
|
||||
return getRuleContext(LiteralContext.class,0);
|
||||
@@ -2862,6 +2894,7 @@ public class EQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
|
||||
@SuppressWarnings("CheckReturnValue")
|
||||
public static class LiteralContext extends ParserRuleContext {
|
||||
public TerminalNode STRING_LITERAL() { return getToken(EQLParser.STRING_LITERAL, 0); }
|
||||
public TerminalNode BOOLEAN_LITERAL() { return getToken(EQLParser.BOOLEAN_LITERAL, 0); }
|
||||
@@ -2894,7 +2927,7 @@ public class EQLParser extends Parser {
|
||||
{
|
||||
setState(356);
|
||||
_la = _input.LA(1);
|
||||
if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (BOOLEAN_LITERAL - 72)) | (1L << (NUMBER_LITERAL - 72)) | (1L << (STRING_LITERAL - 72)))) != 0)) ) {
|
||||
if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 35L) != 0)) ) {
|
||||
_errHandler.recoverInline(this);
|
||||
}
|
||||
else {
|
||||
@@ -2916,125 +2949,224 @@ public class EQLParser extends Parser {
|
||||
}
|
||||
|
||||
public static final String _serializedATN =
|
||||
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3P\u0169\4\2\t\2\4"+
|
||||
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
|
||||
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
|
||||
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
|
||||
"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
|
||||
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
|
||||
",\t,\4-\t-\4.\t.\3\2\5\2^\n\2\3\2\7\2a\n\2\f\2\16\2d\13\2\3\2\5\2g\n\2"+
|
||||
"\3\2\5\2j\n\2\3\2\5\2m\n\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\5\3v\n\3\3\4\3"+
|
||||
"\4\5\4z\n\4\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\7"+
|
||||
"\b\u008a\n\b\f\b\16\b\u008d\13\b\3\t\3\t\5\t\u0091\n\t\3\t\5\t\u0094\n"+
|
||||
"\t\3\n\3\n\3\n\3\n\5\n\u009a\n\n\3\13\3\13\3\f\3\f\3\f\5\f\u00a1\n\f\3"+
|
||||
"\r\3\r\3\r\3\16\3\16\5\16\u00a8\n\16\3\16\3\16\5\16\u00ac\n\16\3\17\3"+
|
||||
"\17\3\17\3\17\3\20\3\20\3\20\7\20\u00b5\n\20\f\20\16\20\u00b8\13\20\3"+
|
||||
"\21\3\21\3\22\3\22\3\22\3\22\5\22\u00c0\n\22\3\23\3\23\3\23\3\24\3\24"+
|
||||
"\3\24\3\25\3\25\5\25\u00ca\n\25\3\26\3\26\5\26\u00ce\n\26\3\27\3\27\5"+
|
||||
"\27\u00d2\n\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\7\31\u00db\n\31\f\31"+
|
||||
"\16\31\u00de\13\31\3\32\3\32\3\32\7\32\u00e3\n\32\f\32\16\32\u00e6\13"+
|
||||
"\32\3\33\5\33\u00e9\n\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\5\34\u00f2"+
|
||||
"\n\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
|
||||
"\3\35\3\35\5\35\u0103\n\35\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3 "+
|
||||
"\3 \3 \3 \3 \7 \u0112\n \f \16 \u0115\13 \3 \3 \5 \u0119\n \3!\3!\3!\3"+
|
||||
"!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3"+
|
||||
"%\5%\u0134\n%\3&\3&\3&\3&\3&\3&\3&\3&\5&\u013e\n&\3\'\3\'\3\'\3\'\3\'"+
|
||||
"\5\'\u0145\n\'\3(\3(\3(\3(\3(\3(\3(\3(\5(\u014f\n(\3)\3)\3)\3)\3*\3*\3"+
|
||||
"+\3+\3+\3+\3+\3+\3+\3+\5+\u015f\n+\3,\3,\3-\3-\5-\u0165\n-\3.\3.\3.\2"+
|
||||
"\2/\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@B"+
|
||||
"DFHJLNPRTVXZ\2\b\3\2\16\17\3\2GH\3\2\35\36\3\2(/\3\2\60E\4\2JKOO\2\u0169"+
|
||||
"\2]\3\2\2\2\4u\3\2\2\2\6w\3\2\2\2\b}\3\2\2\2\n\177\3\2\2\2\f\u0081\3\2"+
|
||||
"\2\2\16\u0084\3\2\2\2\20\u008e\3\2\2\2\22\u0099\3\2\2\2\24\u009b\3\2\2"+
|
||||
"\2\26\u009d\3\2\2\2\30\u00a2\3\2\2\2\32\u00a5\3\2\2\2\34\u00ad\3\2\2\2"+
|
||||
"\36\u00b1\3\2\2\2 \u00b9\3\2\2\2\"\u00bf\3\2\2\2$\u00c1\3\2\2\2&\u00c4"+
|
||||
"\3\2\2\2(\u00c9\3\2\2\2*\u00cb\3\2\2\2,\u00cf\3\2\2\2.\u00d3\3\2\2\2\60"+
|
||||
"\u00d7\3\2\2\2\62\u00df\3\2\2\2\64\u00e8\3\2\2\2\66\u00f1\3\2\2\28\u0102"+
|
||||
"\3\2\2\2:\u0104\3\2\2\2<\u0108\3\2\2\2>\u0118\3\2\2\2@\u011a\3\2\2\2B"+
|
||||
"\u0120\3\2\2\2D\u0126\3\2\2\2F\u0128\3\2\2\2H\u0133\3\2\2\2J\u013d\3\2"+
|
||||
"\2\2L\u0144\3\2\2\2N\u014e\3\2\2\2P\u0150\3\2\2\2R\u0154\3\2\2\2T\u015e"+
|
||||
"\3\2\2\2V\u0160\3\2\2\2X\u0164\3\2\2\2Z\u0166\3\2\2\2\\^\5\6\4\2]\\\3"+
|
||||
"\2\2\2]^\3\2\2\2^b\3\2\2\2_a\5\n\6\2`_\3\2\2\2ad\3\2\2\2b`\3\2\2\2bc\3"+
|
||||
"\2\2\2cf\3\2\2\2db\3\2\2\2eg\5\f\7\2fe\3\2\2\2fg\3\2\2\2gi\3\2\2\2hj\5"+
|
||||
"\16\b\2ih\3\2\2\2ij\3\2\2\2jl\3\2\2\2km\5\26\f\2lk\3\2\2\2lm\3\2\2\2m"+
|
||||
"n\3\2\2\2no\7\2\2\3o\3\3\2\2\2pq\7\3\2\2qr\5\36\20\2rs\7\4\2\2sv\3\2\2"+
|
||||
"\2tv\5\36\20\2up\3\2\2\2ut\3\2\2\2v\5\3\2\2\2wy\7\5\2\2xz\5\b\5\2yx\3"+
|
||||
"\2\2\2yz\3\2\2\2z{\3\2\2\2{|\5\4\3\2|\7\3\2\2\2}~\7\6\2\2~\t\3\2\2\2\177"+
|
||||
"\u0080\5\32\16\2\u0080\13\3\2\2\2\u0081\u0082\7\7\2\2\u0082\u0083\5\60"+
|
||||
"\31\2\u0083\r\3\2\2\2\u0084\u0085\7\b\2\2\u0085\u0086\7\t\2\2\u0086\u008b"+
|
||||
"\5\20\t\2\u0087\u0088\7\n\2\2\u0088\u008a\5\20\t\2\u0089\u0087\3\2\2\2"+
|
||||
"\u008a\u008d\3\2\2\2\u008b\u0089\3\2\2\2\u008b\u008c\3\2\2\2\u008c\17"+
|
||||
"\3\2\2\2\u008d\u008b\3\2\2\2\u008e\u0090\7G\2\2\u008f\u0091\5\24\13\2"+
|
||||
"\u0090\u008f\3\2\2\2\u0090\u0091\3\2\2\2\u0091\u0093\3\2\2\2\u0092\u0094"+
|
||||
"\5\22\n\2\u0093\u0092\3\2\2\2\u0093\u0094\3\2\2\2\u0094\21\3\2\2\2\u0095"+
|
||||
"\u0096\7\13\2\2\u0096\u009a\7\f\2\2\u0097\u0098\7\13\2\2\u0098\u009a\7"+
|
||||
"\r\2\2\u0099\u0095\3\2\2\2\u0099\u0097\3\2\2\2\u009a\23\3\2\2\2\u009b"+
|
||||
"\u009c\t\2\2\2\u009c\25\3\2\2\2\u009d\u009e\7\20\2\2\u009e\u00a0\7K\2"+
|
||||
"\2\u009f\u00a1\5\30\r\2\u00a0\u009f\3\2\2\2\u00a0\u00a1\3\2\2\2\u00a1"+
|
||||
"\27\3\2\2\2\u00a2\u00a3\7\21\2\2\u00a3\u00a4\7K\2\2\u00a4\31\3\2\2\2\u00a5"+
|
||||
"\u00a7\7\22\2\2\u00a6\u00a8\5(\25\2\u00a7\u00a6\3\2\2\2\u00a7\u00a8\3"+
|
||||
"\2\2\2\u00a8\u00a9\3\2\2\2\u00a9\u00ab\5 \21\2\u00aa\u00ac\5\34\17\2\u00ab"+
|
||||
"\u00aa\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\33\3\2\2\2\u00ad\u00ae\7\3\2"+
|
||||
"\2\u00ae\u00af\5\36\20\2\u00af\u00b0\7\4\2\2\u00b0\35\3\2\2\2\u00b1\u00b6"+
|
||||
"\5\"\22\2\u00b2\u00b3\7\n\2\2\u00b3\u00b5\5\"\22\2\u00b4\u00b2\3\2\2\2"+
|
||||
"\u00b5\u00b8\3\2\2\2\u00b6\u00b4\3\2\2\2\u00b6\u00b7\3\2\2\2\u00b7\37"+
|
||||
"\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b9\u00ba\t\3\2\2\u00ba!\3\2\2\2\u00bb"+
|
||||
"\u00c0\7G\2\2\u00bc\u00c0\5$\23\2\u00bd\u00c0\5&\24\2\u00be\u00c0\7I\2"+
|
||||
"\2\u00bf\u00bb\3\2\2\2\u00bf\u00bc\3\2\2\2\u00bf\u00bd\3\2\2\2\u00bf\u00be"+
|
||||
"\3\2\2\2\u00c0#\3\2\2\2\u00c1\u00c2\7\23\2\2\u00c2\u00c3\5*\26\2\u00c3"+
|
||||
"%\3\2\2\2\u00c4\u00c5\7\23\2\2\u00c5\u00c6\5,\27\2\u00c6\'\3\2\2\2\u00c7"+
|
||||
"\u00ca\5*\26\2\u00c8\u00ca\5,\27\2\u00c9\u00c7\3\2\2\2\u00c9\u00c8\3\2"+
|
||||
"\2\2\u00ca)\3\2\2\2\u00cb\u00cd\7\24\2\2\u00cc\u00ce\5.\30\2\u00cd\u00cc"+
|
||||
"\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce+\3\2\2\2\u00cf\u00d1\7\25\2\2\u00d0"+
|
||||
"\u00d2\5.\30\2\u00d1\u00d0\3\2\2\2\u00d1\u00d2\3\2\2\2\u00d2-\3\2\2\2"+
|
||||
"\u00d3\u00d4\7\3\2\2\u00d4\u00d5\7K\2\2\u00d5\u00d6\7\4\2\2\u00d6/\3\2"+
|
||||
"\2\2\u00d7\u00dc\5\62\32\2\u00d8\u00d9\7\26\2\2\u00d9\u00db\5\62\32\2"+
|
||||
"\u00da\u00d8\3\2\2\2\u00db\u00de\3\2\2\2\u00dc\u00da\3\2\2\2\u00dc\u00dd"+
|
||||
"\3\2\2\2\u00dd\61\3\2\2\2\u00de\u00dc\3\2\2\2\u00df\u00e4\5\64\33\2\u00e0"+
|
||||
"\u00e1\7\27\2\2\u00e1\u00e3\5\64\33\2\u00e2\u00e0\3\2\2\2\u00e3\u00e6"+
|
||||
"\3\2\2\2\u00e4\u00e2\3\2\2\2\u00e4\u00e5\3\2\2\2\u00e5\63\3\2\2\2\u00e6"+
|
||||
"\u00e4\3\2\2\2\u00e7\u00e9\7\30\2\2\u00e8\u00e7\3\2\2\2\u00e8\u00e9\3"+
|
||||
"\2\2\2\u00e9\u00ea\3\2\2\2\u00ea\u00eb\5\66\34\2\u00eb\65\3\2\2\2\u00ec"+
|
||||
"\u00f2\58\35\2\u00ed\u00ee\7\3\2\2\u00ee\u00ef\5\60\31\2\u00ef\u00f0\7"+
|
||||
"\4\2\2\u00f0\u00f2\3\2\2\2\u00f1\u00ec\3\2\2\2\u00f1\u00ed\3\2\2\2\u00f2"+
|
||||
"\67\3\2\2\2\u00f3\u0103\5T+\2\u00f4\u0103\5P)\2\u00f5\u0103\5B\"\2\u00f6"+
|
||||
"\u0103\5@!\2\u00f7\u0103\5F$\2\u00f8\u0103\5:\36\2\u00f9\u0103\5<\37\2"+
|
||||
"\u00fa\u0103\5H%\2\u00fb\u0103\5J&\2\u00fc\u0103\5L\'\2\u00fd\u0103\5"+
|
||||
"N(\2\u00fe\u00ff\7\3\2\2\u00ff\u0100\58\35\2\u0100\u0101\7\4\2\2\u0101"+
|
||||
"\u0103\3\2\2\2\u0102\u00f3\3\2\2\2\u0102\u00f4\3\2\2\2\u0102\u00f5\3\2"+
|
||||
"\2\2\u0102\u00f6\3\2\2\2\u0102\u00f7\3\2\2\2\u0102\u00f8\3\2\2\2\u0102"+
|
||||
"\u00f9\3\2\2\2\u0102\u00fa\3\2\2\2\u0102\u00fb\3\2\2\2\u0102\u00fc\3\2"+
|
||||
"\2\2\u0102\u00fd\3\2\2\2\u0102\u00fe\3\2\2\2\u01039\3\2\2\2\u0104\u0105"+
|
||||
"\7G\2\2\u0105\u0106\7\31\2\2\u0106\u0107\5> \2\u0107;\3\2\2\2\u0108\u0109"+
|
||||
"\7G\2\2\u0109\u010a\7\32\2\2\u010a\u010b\5> \2\u010b=\3\2\2\2\u010c\u0119"+
|
||||
"\7F\2\2\u010d\u010e\7\3\2\2\u010e\u0113\5X-\2\u010f\u0110\7\n\2\2\u0110"+
|
||||
"\u0112\5X-\2\u0111\u010f\3\2\2\2\u0112\u0115\3\2\2\2\u0113\u0111\3\2\2"+
|
||||
"\2\u0113\u0114\3\2\2\2\u0114\u0116\3\2\2\2\u0115\u0113\3\2\2\2\u0116\u0117"+
|
||||
"\7\4\2\2\u0117\u0119\3\2\2\2\u0118\u010c\3\2\2\2\u0118\u010d\3\2\2\2\u0119"+
|
||||
"?\3\2\2\2\u011a\u011b\7G\2\2\u011b\u011c\7\33\2\2\u011c\u011d\5X-\2\u011d"+
|
||||
"\u011e\7\27\2\2\u011e\u011f\5X-\2\u011fA\3\2\2\2\u0120\u0121\7G\2\2\u0121"+
|
||||
"\u0122\5D#\2\u0122\u0123\5X-\2\u0123\u0124\7\34\2\2\u0124\u0125\5X-\2"+
|
||||
"\u0125C\3\2\2\2\u0126\u0127\t\4\2\2\u0127E\3\2\2\2\u0128\u0129\5X-\2\u0129"+
|
||||
"\u012a\7\33\2\2\u012a\u012b\7G\2\2\u012b\u012c\7\27\2\2\u012c\u012d\7"+
|
||||
"G\2\2\u012dG\3\2\2\2\u012e\u012f\7G\2\2\u012f\u0130\7\37\2\2\u0130\u0134"+
|
||||
"\7 \2\2\u0131\u0132\7G\2\2\u0132\u0134\7!\2\2\u0133\u012e\3\2\2\2\u0133"+
|
||||
"\u0131\3\2\2\2\u0134I\3\2\2\2\u0135\u0136\7G\2\2\u0136\u0137\7\37\2\2"+
|
||||
"\u0137\u0138\7\30\2\2\u0138\u013e\7 \2\2\u0139\u013a\7G\2\2\u013a\u013e"+
|
||||
"\7\"\2\2\u013b\u013c\7G\2\2\u013c\u013e\7#\2\2\u013d\u0135\3\2\2\2\u013d"+
|
||||
"\u0139\3\2\2\2\u013d\u013b\3\2\2\2\u013eK\3\2\2\2\u013f\u0140\7G\2\2\u0140"+
|
||||
"\u0141\7\37\2\2\u0141\u0145\7$\2\2\u0142\u0143\7G\2\2\u0143\u0145\7%\2"+
|
||||
"\2\u0144\u013f\3\2\2\2\u0144\u0142\3\2\2\2\u0145M\3\2\2\2\u0146\u0147"+
|
||||
"\7G\2\2\u0147\u0148\7\37\2\2\u0148\u0149\7\30\2\2\u0149\u014f\7$\2\2\u014a"+
|
||||
"\u014b\7G\2\2\u014b\u014f\7&\2\2\u014c\u014d\7G\2\2\u014d\u014f\7\'\2"+
|
||||
"\2\u014e\u0146\3\2\2\2\u014e\u014a\3\2\2\2\u014e\u014c\3\2\2\2\u014fO"+
|
||||
"\3\2\2\2\u0150\u0151\7G\2\2\u0151\u0152\5R*\2\u0152\u0153\5X-\2\u0153"+
|
||||
"Q\3\2\2\2\u0154\u0155\t\5\2\2\u0155S\3\2\2\2\u0156\u0157\7G\2\2\u0157"+
|
||||
"\u0158\5V,\2\u0158\u0159\5X-\2\u0159\u015f\3\2\2\2\u015a\u015b\5X-\2\u015b"+
|
||||
"\u015c\5V,\2\u015c\u015d\7G\2\2\u015d\u015f\3\2\2\2\u015e\u0156\3\2\2"+
|
||||
"\2\u015e\u015a\3\2\2\2\u015fU\3\2\2\2\u0160\u0161\t\6\2\2\u0161W\3\2\2"+
|
||||
"\2\u0162\u0165\5Z.\2\u0163\u0165\7F\2\2\u0164\u0162\3\2\2\2\u0164\u0163"+
|
||||
"\3\2\2\2\u0165Y\3\2\2\2\u0166\u0167\t\7\2\2\u0167[\3\2\2\2\"]bfiluy\u008b"+
|
||||
"\u0090\u0093\u0099\u00a0\u00a7\u00ab\u00b6\u00bf\u00c9\u00cd\u00d1\u00dc"+
|
||||
"\u00e4\u00e8\u00f1\u0102\u0113\u0118\u0133\u013d\u0144\u014e\u015e\u0164";
|
||||
"\u0004\u0001N\u0167\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+
|
||||
"\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+
|
||||
"\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+
|
||||
"\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+
|
||||
"\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+
|
||||
"\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+
|
||||
"\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+
|
||||
"\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+
|
||||
"\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+
|
||||
"\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+
|
||||
"\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+
|
||||
"#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+
|
||||
"(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0001"+
|
||||
"\u0000\u0003\u0000\\\b\u0000\u0001\u0000\u0005\u0000_\b\u0000\n\u0000"+
|
||||
"\f\u0000b\t\u0000\u0001\u0000\u0003\u0000e\b\u0000\u0001\u0000\u0003\u0000"+
|
||||
"h\b\u0000\u0001\u0000\u0003\u0000k\b\u0000\u0001\u0000\u0001\u0000\u0001"+
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001t\b"+
|
||||
"\u0001\u0001\u0002\u0001\u0002\u0003\u0002x\b\u0002\u0001\u0002\u0001"+
|
||||
"\u0002\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001"+
|
||||
"\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+
|
||||
"\u0006\u0005\u0006\u0088\b\u0006\n\u0006\f\u0006\u008b\t\u0006\u0001\u0007"+
|
||||
"\u0001\u0007\u0003\u0007\u008f\b\u0007\u0001\u0007\u0003\u0007\u0092\b"+
|
||||
"\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u0098\b\b\u0001\t\u0001"+
|
||||
"\t\u0001\n\u0001\n\u0001\n\u0003\n\u009f\b\n\u0001\u000b\u0001\u000b\u0001"+
|
||||
"\u000b\u0001\f\u0001\f\u0003\f\u00a6\b\f\u0001\f\u0001\f\u0003\f\u00aa"+
|
||||
"\b\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e"+
|
||||
"\u0005\u000e\u00b3\b\u000e\n\u000e\f\u000e\u00b6\t\u000e\u0001\u000f\u0001"+
|
||||
"\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u00be"+
|
||||
"\b\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001"+
|
||||
"\u0012\u0001\u0013\u0001\u0013\u0003\u0013\u00c8\b\u0013\u0001\u0014\u0001"+
|
||||
"\u0014\u0003\u0014\u00cc\b\u0014\u0001\u0015\u0001\u0015\u0003\u0015\u00d0"+
|
||||
"\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+
|
||||
"\u0017\u0001\u0017\u0005\u0017\u00d9\b\u0017\n\u0017\f\u0017\u00dc\t\u0017"+
|
||||
"\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u00e1\b\u0018\n\u0018"+
|
||||
"\f\u0018\u00e4\t\u0018\u0001\u0019\u0003\u0019\u00e7\b\u0019\u0001\u0019"+
|
||||
"\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+
|
||||
"\u0003\u001a\u00f0\b\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+
|
||||
"\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+
|
||||
"\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0003\u001b"+
|
||||
"\u0101\b\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d"+
|
||||
"\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e"+
|
||||
"\u0001\u001e\u0001\u001e\u0005\u001e\u0110\b\u001e\n\u001e\f\u001e\u0113"+
|
||||
"\t\u001e\u0001\u001e\u0001\u001e\u0003\u001e\u0117\b\u001e\u0001\u001f"+
|
||||
"\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001"+
|
||||
" \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001"+
|
||||
"\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0003#\u0132\b#"+
|
||||
"\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0003$\u013c"+
|
||||
"\b$\u0001%\u0001%\u0001%\u0001%\u0001%\u0003%\u0143\b%\u0001&\u0001&\u0001"+
|
||||
"&\u0001&\u0001&\u0001&\u0001&\u0001&\u0003&\u014d\b&\u0001\'\u0001\'\u0001"+
|
||||
"\'\u0001\'\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+
|
||||
")\u0001)\u0003)\u015d\b)\u0001*\u0001*\u0001+\u0001+\u0003+\u0163\b+\u0001"+
|
||||
",\u0001,\u0001,\u0000\u0000-\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+
|
||||
"\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPR"+
|
||||
"TVX\u0000\u0006\u0001\u0000\f\r\u0001\u0000EF\u0001\u0000\u001b\u001c"+
|
||||
"\u0001\u0000&-\u0001\u0000.C\u0002\u0000HIMM\u0167\u0000[\u0001\u0000"+
|
||||
"\u0000\u0000\u0002s\u0001\u0000\u0000\u0000\u0004u\u0001\u0000\u0000\u0000"+
|
||||
"\u0006{\u0001\u0000\u0000\u0000\b}\u0001\u0000\u0000\u0000\n\u007f\u0001"+
|
||||
"\u0000\u0000\u0000\f\u0082\u0001\u0000\u0000\u0000\u000e\u008c\u0001\u0000"+
|
||||
"\u0000\u0000\u0010\u0097\u0001\u0000\u0000\u0000\u0012\u0099\u0001\u0000"+
|
||||
"\u0000\u0000\u0014\u009b\u0001\u0000\u0000\u0000\u0016\u00a0\u0001\u0000"+
|
||||
"\u0000\u0000\u0018\u00a3\u0001\u0000\u0000\u0000\u001a\u00ab\u0001\u0000"+
|
||||
"\u0000\u0000\u001c\u00af\u0001\u0000\u0000\u0000\u001e\u00b7\u0001\u0000"+
|
||||
"\u0000\u0000 \u00bd\u0001\u0000\u0000\u0000\"\u00bf\u0001\u0000\u0000"+
|
||||
"\u0000$\u00c2\u0001\u0000\u0000\u0000&\u00c7\u0001\u0000\u0000\u0000("+
|
||||
"\u00c9\u0001\u0000\u0000\u0000*\u00cd\u0001\u0000\u0000\u0000,\u00d1\u0001"+
|
||||
"\u0000\u0000\u0000.\u00d5\u0001\u0000\u0000\u00000\u00dd\u0001\u0000\u0000"+
|
||||
"\u00002\u00e6\u0001\u0000\u0000\u00004\u00ef\u0001\u0000\u0000\u00006"+
|
||||
"\u0100\u0001\u0000\u0000\u00008\u0102\u0001\u0000\u0000\u0000:\u0106\u0001"+
|
||||
"\u0000\u0000\u0000<\u0116\u0001\u0000\u0000\u0000>\u0118\u0001\u0000\u0000"+
|
||||
"\u0000@\u011e\u0001\u0000\u0000\u0000B\u0124\u0001\u0000\u0000\u0000D"+
|
||||
"\u0126\u0001\u0000\u0000\u0000F\u0131\u0001\u0000\u0000\u0000H\u013b\u0001"+
|
||||
"\u0000\u0000\u0000J\u0142\u0001\u0000\u0000\u0000L\u014c\u0001\u0000\u0000"+
|
||||
"\u0000N\u014e\u0001\u0000\u0000\u0000P\u0152\u0001\u0000\u0000\u0000R"+
|
||||
"\u015c\u0001\u0000\u0000\u0000T\u015e\u0001\u0000\u0000\u0000V\u0162\u0001"+
|
||||
"\u0000\u0000\u0000X\u0164\u0001\u0000\u0000\u0000Z\\\u0003\u0004\u0002"+
|
||||
"\u0000[Z\u0001\u0000\u0000\u0000[\\\u0001\u0000\u0000\u0000\\`\u0001\u0000"+
|
||||
"\u0000\u0000]_\u0003\b\u0004\u0000^]\u0001\u0000\u0000\u0000_b\u0001\u0000"+
|
||||
"\u0000\u0000`^\u0001\u0000\u0000\u0000`a\u0001\u0000\u0000\u0000ad\u0001"+
|
||||
"\u0000\u0000\u0000b`\u0001\u0000\u0000\u0000ce\u0003\n\u0005\u0000dc\u0001"+
|
||||
"\u0000\u0000\u0000de\u0001\u0000\u0000\u0000eg\u0001\u0000\u0000\u0000"+
|
||||
"fh\u0003\f\u0006\u0000gf\u0001\u0000\u0000\u0000gh\u0001\u0000\u0000\u0000"+
|
||||
"hj\u0001\u0000\u0000\u0000ik\u0003\u0014\n\u0000ji\u0001\u0000\u0000\u0000"+
|
||||
"jk\u0001\u0000\u0000\u0000kl\u0001\u0000\u0000\u0000lm\u0005\u0000\u0000"+
|
||||
"\u0001m\u0001\u0001\u0000\u0000\u0000no\u0005\u0001\u0000\u0000op\u0003"+
|
||||
"\u001c\u000e\u0000pq\u0005\u0002\u0000\u0000qt\u0001\u0000\u0000\u0000"+
|
||||
"rt\u0003\u001c\u000e\u0000sn\u0001\u0000\u0000\u0000sr\u0001\u0000\u0000"+
|
||||
"\u0000t\u0003\u0001\u0000\u0000\u0000uw\u0005\u0003\u0000\u0000vx\u0003"+
|
||||
"\u0006\u0003\u0000wv\u0001\u0000\u0000\u0000wx\u0001\u0000\u0000\u0000"+
|
||||
"xy\u0001\u0000\u0000\u0000yz\u0003\u0002\u0001\u0000z\u0005\u0001\u0000"+
|
||||
"\u0000\u0000{|\u0005\u0004\u0000\u0000|\u0007\u0001\u0000\u0000\u0000"+
|
||||
"}~\u0003\u0018\f\u0000~\t\u0001\u0000\u0000\u0000\u007f\u0080\u0005\u0005"+
|
||||
"\u0000\u0000\u0080\u0081\u0003.\u0017\u0000\u0081\u000b\u0001\u0000\u0000"+
|
||||
"\u0000\u0082\u0083\u0005\u0006\u0000\u0000\u0083\u0084\u0005\u0007\u0000"+
|
||||
"\u0000\u0084\u0089\u0003\u000e\u0007\u0000\u0085\u0086\u0005\b\u0000\u0000"+
|
||||
"\u0086\u0088\u0003\u000e\u0007\u0000\u0087\u0085\u0001\u0000\u0000\u0000"+
|
||||
"\u0088\u008b\u0001\u0000\u0000\u0000\u0089\u0087\u0001\u0000\u0000\u0000"+
|
||||
"\u0089\u008a\u0001\u0000\u0000\u0000\u008a\r\u0001\u0000\u0000\u0000\u008b"+
|
||||
"\u0089\u0001\u0000\u0000\u0000\u008c\u008e\u0005E\u0000\u0000\u008d\u008f"+
|
||||
"\u0003\u0012\t\u0000\u008e\u008d\u0001\u0000\u0000\u0000\u008e\u008f\u0001"+
|
||||
"\u0000\u0000\u0000\u008f\u0091\u0001\u0000\u0000\u0000\u0090\u0092\u0003"+
|
||||
"\u0010\b\u0000\u0091\u0090\u0001\u0000\u0000\u0000\u0091\u0092\u0001\u0000"+
|
||||
"\u0000\u0000\u0092\u000f\u0001\u0000\u0000\u0000\u0093\u0094\u0005\t\u0000"+
|
||||
"\u0000\u0094\u0098\u0005\n\u0000\u0000\u0095\u0096\u0005\t\u0000\u0000"+
|
||||
"\u0096\u0098\u0005\u000b\u0000\u0000\u0097\u0093\u0001\u0000\u0000\u0000"+
|
||||
"\u0097\u0095\u0001\u0000\u0000\u0000\u0098\u0011\u0001\u0000\u0000\u0000"+
|
||||
"\u0099\u009a\u0007\u0000\u0000\u0000\u009a\u0013\u0001\u0000\u0000\u0000"+
|
||||
"\u009b\u009c\u0005\u000e\u0000\u0000\u009c\u009e\u0005I\u0000\u0000\u009d"+
|
||||
"\u009f\u0003\u0016\u000b\u0000\u009e\u009d\u0001\u0000\u0000\u0000\u009e"+
|
||||
"\u009f\u0001\u0000\u0000\u0000\u009f\u0015\u0001\u0000\u0000\u0000\u00a0"+
|
||||
"\u00a1\u0005\u000f\u0000\u0000\u00a1\u00a2\u0005I\u0000\u0000\u00a2\u0017"+
|
||||
"\u0001\u0000\u0000\u0000\u00a3\u00a5\u0005\u0010\u0000\u0000\u00a4\u00a6"+
|
||||
"\u0003&\u0013\u0000\u00a5\u00a4\u0001\u0000\u0000\u0000\u00a5\u00a6\u0001"+
|
||||
"\u0000\u0000\u0000\u00a6\u00a7\u0001\u0000\u0000\u0000\u00a7\u00a9\u0003"+
|
||||
"\u001e\u000f\u0000\u00a8\u00aa\u0003\u001a\r\u0000\u00a9\u00a8\u0001\u0000"+
|
||||
"\u0000\u0000\u00a9\u00aa\u0001\u0000\u0000\u0000\u00aa\u0019\u0001\u0000"+
|
||||
"\u0000\u0000\u00ab\u00ac\u0005\u0001\u0000\u0000\u00ac\u00ad\u0003\u001c"+
|
||||
"\u000e\u0000\u00ad\u00ae\u0005\u0002\u0000\u0000\u00ae\u001b\u0001\u0000"+
|
||||
"\u0000\u0000\u00af\u00b4\u0003 \u0010\u0000\u00b0\u00b1\u0005\b\u0000"+
|
||||
"\u0000\u00b1\u00b3\u0003 \u0010\u0000\u00b2\u00b0\u0001\u0000\u0000\u0000"+
|
||||
"\u00b3\u00b6\u0001\u0000\u0000\u0000\u00b4\u00b2\u0001\u0000\u0000\u0000"+
|
||||
"\u00b4\u00b5\u0001\u0000\u0000\u0000\u00b5\u001d\u0001\u0000\u0000\u0000"+
|
||||
"\u00b6\u00b4\u0001\u0000\u0000\u0000\u00b7\u00b8\u0007\u0001\u0000\u0000"+
|
||||
"\u00b8\u001f\u0001\u0000\u0000\u0000\u00b9\u00be\u0005E\u0000\u0000\u00ba"+
|
||||
"\u00be\u0003\"\u0011\u0000\u00bb\u00be\u0003$\u0012\u0000\u00bc\u00be"+
|
||||
"\u0005G\u0000\u0000\u00bd\u00b9\u0001\u0000\u0000\u0000\u00bd\u00ba\u0001"+
|
||||
"\u0000\u0000\u0000\u00bd\u00bb\u0001\u0000\u0000\u0000\u00bd\u00bc\u0001"+
|
||||
"\u0000\u0000\u0000\u00be!\u0001\u0000\u0000\u0000\u00bf\u00c0\u0005\u0011"+
|
||||
"\u0000\u0000\u00c0\u00c1\u0003(\u0014\u0000\u00c1#\u0001\u0000\u0000\u0000"+
|
||||
"\u00c2\u00c3\u0005\u0011\u0000\u0000\u00c3\u00c4\u0003*\u0015\u0000\u00c4"+
|
||||
"%\u0001\u0000\u0000\u0000\u00c5\u00c8\u0003(\u0014\u0000\u00c6\u00c8\u0003"+
|
||||
"*\u0015\u0000\u00c7\u00c5\u0001\u0000\u0000\u0000\u00c7\u00c6\u0001\u0000"+
|
||||
"\u0000\u0000\u00c8\'\u0001\u0000\u0000\u0000\u00c9\u00cb\u0005\u0012\u0000"+
|
||||
"\u0000\u00ca\u00cc\u0003,\u0016\u0000\u00cb\u00ca\u0001\u0000\u0000\u0000"+
|
||||
"\u00cb\u00cc\u0001\u0000\u0000\u0000\u00cc)\u0001\u0000\u0000\u0000\u00cd"+
|
||||
"\u00cf\u0005\u0013\u0000\u0000\u00ce\u00d0\u0003,\u0016\u0000\u00cf\u00ce"+
|
||||
"\u0001\u0000\u0000\u0000\u00cf\u00d0\u0001\u0000\u0000\u0000\u00d0+\u0001"+
|
||||
"\u0000\u0000\u0000\u00d1\u00d2\u0005\u0001\u0000\u0000\u00d2\u00d3\u0005"+
|
||||
"I\u0000\u0000\u00d3\u00d4\u0005\u0002\u0000\u0000\u00d4-\u0001\u0000\u0000"+
|
||||
"\u0000\u00d5\u00da\u00030\u0018\u0000\u00d6\u00d7\u0005\u0014\u0000\u0000"+
|
||||
"\u00d7\u00d9\u00030\u0018\u0000\u00d8\u00d6\u0001\u0000\u0000\u0000\u00d9"+
|
||||
"\u00dc\u0001\u0000\u0000\u0000\u00da\u00d8\u0001\u0000\u0000\u0000\u00da"+
|
||||
"\u00db\u0001\u0000\u0000\u0000\u00db/\u0001\u0000\u0000\u0000\u00dc\u00da"+
|
||||
"\u0001\u0000\u0000\u0000\u00dd\u00e2\u00032\u0019\u0000\u00de\u00df\u0005"+
|
||||
"\u0015\u0000\u0000\u00df\u00e1\u00032\u0019\u0000\u00e0\u00de\u0001\u0000"+
|
||||
"\u0000\u0000\u00e1\u00e4\u0001\u0000\u0000\u0000\u00e2\u00e0\u0001\u0000"+
|
||||
"\u0000\u0000\u00e2\u00e3\u0001\u0000\u0000\u0000\u00e31\u0001\u0000\u0000"+
|
||||
"\u0000\u00e4\u00e2\u0001\u0000\u0000\u0000\u00e5\u00e7\u0005\u0016\u0000"+
|
||||
"\u0000\u00e6\u00e5\u0001\u0000\u0000\u0000\u00e6\u00e7\u0001\u0000\u0000"+
|
||||
"\u0000\u00e7\u00e8\u0001\u0000\u0000\u0000\u00e8\u00e9\u00034\u001a\u0000"+
|
||||
"\u00e93\u0001\u0000\u0000\u0000\u00ea\u00f0\u00036\u001b\u0000\u00eb\u00ec"+
|
||||
"\u0005\u0001\u0000\u0000\u00ec\u00ed\u0003.\u0017\u0000\u00ed\u00ee\u0005"+
|
||||
"\u0002\u0000\u0000\u00ee\u00f0\u0001\u0000\u0000\u0000\u00ef\u00ea\u0001"+
|
||||
"\u0000\u0000\u0000\u00ef\u00eb\u0001\u0000\u0000\u0000\u00f05\u0001\u0000"+
|
||||
"\u0000\u0000\u00f1\u0101\u0003R)\u0000\u00f2\u0101\u0003N\'\u0000\u00f3"+
|
||||
"\u0101\u0003@ \u0000\u00f4\u0101\u0003>\u001f\u0000\u00f5\u0101\u0003"+
|
||||
"D\"\u0000\u00f6\u0101\u00038\u001c\u0000\u00f7\u0101\u0003:\u001d\u0000"+
|
||||
"\u00f8\u0101\u0003F#\u0000\u00f9\u0101\u0003H$\u0000\u00fa\u0101\u0003"+
|
||||
"J%\u0000\u00fb\u0101\u0003L&\u0000\u00fc\u00fd\u0005\u0001\u0000\u0000"+
|
||||
"\u00fd\u00fe\u00036\u001b\u0000\u00fe\u00ff\u0005\u0002\u0000\u0000\u00ff"+
|
||||
"\u0101\u0001\u0000\u0000\u0000\u0100\u00f1\u0001\u0000\u0000\u0000\u0100"+
|
||||
"\u00f2\u0001\u0000\u0000\u0000\u0100\u00f3\u0001\u0000\u0000\u0000\u0100"+
|
||||
"\u00f4\u0001\u0000\u0000\u0000\u0100\u00f5\u0001\u0000\u0000\u0000\u0100"+
|
||||
"\u00f6\u0001\u0000\u0000\u0000\u0100\u00f7\u0001\u0000\u0000\u0000\u0100"+
|
||||
"\u00f8\u0001\u0000\u0000\u0000\u0100\u00f9\u0001\u0000\u0000\u0000\u0100"+
|
||||
"\u00fa\u0001\u0000\u0000\u0000\u0100\u00fb\u0001\u0000\u0000\u0000\u0100"+
|
||||
"\u00fc\u0001\u0000\u0000\u0000\u01017\u0001\u0000\u0000\u0000\u0102\u0103"+
|
||||
"\u0005E\u0000\u0000\u0103\u0104\u0005\u0017\u0000\u0000\u0104\u0105\u0003"+
|
||||
"<\u001e\u0000\u01059\u0001\u0000\u0000\u0000\u0106\u0107\u0005E\u0000"+
|
||||
"\u0000\u0107\u0108\u0005\u0018\u0000\u0000\u0108\u0109\u0003<\u001e\u0000"+
|
||||
"\u0109;\u0001\u0000\u0000\u0000\u010a\u0117\u0005D\u0000\u0000\u010b\u010c"+
|
||||
"\u0005\u0001\u0000\u0000\u010c\u0111\u0003V+\u0000\u010d\u010e\u0005\b"+
|
||||
"\u0000\u0000\u010e\u0110\u0003V+\u0000\u010f\u010d\u0001\u0000\u0000\u0000"+
|
||||
"\u0110\u0113\u0001\u0000\u0000\u0000\u0111\u010f\u0001\u0000\u0000\u0000"+
|
||||
"\u0111\u0112\u0001\u0000\u0000\u0000\u0112\u0114\u0001\u0000\u0000\u0000"+
|
||||
"\u0113\u0111\u0001\u0000\u0000\u0000\u0114\u0115\u0005\u0002\u0000\u0000"+
|
||||
"\u0115\u0117\u0001\u0000\u0000\u0000\u0116\u010a\u0001\u0000\u0000\u0000"+
|
||||
"\u0116\u010b\u0001\u0000\u0000\u0000\u0117=\u0001\u0000\u0000\u0000\u0118"+
|
||||
"\u0119\u0005E\u0000\u0000\u0119\u011a\u0005\u0019\u0000\u0000\u011a\u011b"+
|
||||
"\u0003V+\u0000\u011b\u011c\u0005\u0015\u0000\u0000\u011c\u011d\u0003V"+
|
||||
"+\u0000\u011d?\u0001\u0000\u0000\u0000\u011e\u011f\u0005E\u0000\u0000"+
|
||||
"\u011f\u0120\u0003B!\u0000\u0120\u0121\u0003V+\u0000\u0121\u0122\u0005"+
|
||||
"\u001a\u0000\u0000\u0122\u0123\u0003V+\u0000\u0123A\u0001\u0000\u0000"+
|
||||
"\u0000\u0124\u0125\u0007\u0002\u0000\u0000\u0125C\u0001\u0000\u0000\u0000"+
|
||||
"\u0126\u0127\u0003V+\u0000\u0127\u0128\u0005\u0019\u0000\u0000\u0128\u0129"+
|
||||
"\u0005E\u0000\u0000\u0129\u012a\u0005\u0015\u0000\u0000\u012a\u012b\u0005"+
|
||||
"E\u0000\u0000\u012bE\u0001\u0000\u0000\u0000\u012c\u012d\u0005E\u0000"+
|
||||
"\u0000\u012d\u012e\u0005\u001d\u0000\u0000\u012e\u0132\u0005\u001e\u0000"+
|
||||
"\u0000\u012f\u0130\u0005E\u0000\u0000\u0130\u0132\u0005\u001f\u0000\u0000"+
|
||||
"\u0131\u012c\u0001\u0000\u0000\u0000\u0131\u012f\u0001\u0000\u0000\u0000"+
|
||||
"\u0132G\u0001\u0000\u0000\u0000\u0133\u0134\u0005E\u0000\u0000\u0134\u0135"+
|
||||
"\u0005\u001d\u0000\u0000\u0135\u0136\u0005\u0016\u0000\u0000\u0136\u013c"+
|
||||
"\u0005\u001e\u0000\u0000\u0137\u0138\u0005E\u0000\u0000\u0138\u013c\u0005"+
|
||||
" \u0000\u0000\u0139\u013a\u0005E\u0000\u0000\u013a\u013c\u0005!\u0000"+
|
||||
"\u0000\u013b\u0133\u0001\u0000\u0000\u0000\u013b\u0137\u0001\u0000\u0000"+
|
||||
"\u0000\u013b\u0139\u0001\u0000\u0000\u0000\u013cI\u0001\u0000\u0000\u0000"+
|
||||
"\u013d\u013e\u0005E\u0000\u0000\u013e\u013f\u0005\u001d\u0000\u0000\u013f"+
|
||||
"\u0143\u0005\"\u0000\u0000\u0140\u0141\u0005E\u0000\u0000\u0141\u0143"+
|
||||
"\u0005#\u0000\u0000\u0142\u013d\u0001\u0000\u0000\u0000\u0142\u0140\u0001"+
|
||||
"\u0000\u0000\u0000\u0143K\u0001\u0000\u0000\u0000\u0144\u0145\u0005E\u0000"+
|
||||
"\u0000\u0145\u0146\u0005\u001d\u0000\u0000\u0146\u0147\u0005\u0016\u0000"+
|
||||
"\u0000\u0147\u014d\u0005\"\u0000\u0000\u0148\u0149\u0005E\u0000\u0000"+
|
||||
"\u0149\u014d\u0005$\u0000\u0000\u014a\u014b\u0005E\u0000\u0000\u014b\u014d"+
|
||||
"\u0005%\u0000\u0000\u014c\u0144\u0001\u0000\u0000\u0000\u014c\u0148\u0001"+
|
||||
"\u0000\u0000\u0000\u014c\u014a\u0001\u0000\u0000\u0000\u014dM\u0001\u0000"+
|
||||
"\u0000\u0000\u014e\u014f\u0005E\u0000\u0000\u014f\u0150\u0003P(\u0000"+
|
||||
"\u0150\u0151\u0003V+\u0000\u0151O\u0001\u0000\u0000\u0000\u0152\u0153"+
|
||||
"\u0007\u0003\u0000\u0000\u0153Q\u0001\u0000\u0000\u0000\u0154\u0155\u0005"+
|
||||
"E\u0000\u0000\u0155\u0156\u0003T*\u0000\u0156\u0157\u0003V+\u0000\u0157"+
|
||||
"\u015d\u0001\u0000\u0000\u0000\u0158\u0159\u0003V+\u0000\u0159\u015a\u0003"+
|
||||
"T*\u0000\u015a\u015b\u0005E\u0000\u0000\u015b\u015d\u0001\u0000\u0000"+
|
||||
"\u0000\u015c\u0154\u0001\u0000\u0000\u0000\u015c\u0158\u0001\u0000\u0000"+
|
||||
"\u0000\u015dS\u0001\u0000\u0000\u0000\u015e\u015f\u0007\u0004\u0000\u0000"+
|
||||
"\u015fU\u0001\u0000\u0000\u0000\u0160\u0163\u0003X,\u0000\u0161\u0163"+
|
||||
"\u0005D\u0000\u0000\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0161\u0001"+
|
||||
"\u0000\u0000\u0000\u0163W\u0001\u0000\u0000\u0000\u0164\u0165\u0007\u0005"+
|
||||
"\u0000\u0000\u0165Y\u0001\u0000\u0000\u0000 [`dgjsw\u0089\u008e\u0091"+
|
||||
"\u0097\u009e\u00a5\u00a9\u00b4\u00bd\u00c7\u00cb\u00cf\u00da\u00e2\u00e6"+
|
||||
"\u00ef\u0100\u0111\u0116\u0131\u013b\u0142\u014c\u015c\u0162";
|
||||
public static final ATN _ATN =
|
||||
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
|
||||
static {
|
||||
@@ -3043,4 +3175,4 @@ public class EQLParser extends Parser {
|
||||
_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Generated from /home/rob/github/ebean-dir/ebean/src/test/resources/EQL.g4 by ANTLR 4.8
|
||||
// Generated from /Users/robinbygrave/Documents/github/ebean/ebean/ebean-test/src/test/resources/EQL.g4 by ANTLR 4.13.1
|
||||
package io.ebeaninternal.server.grammer.antlr;
|
||||
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
|
||||
|
||||
|
||||
@@ -52,10 +52,15 @@ abstract class DLoadBaseContext {
|
||||
void setLabel(SpiQuery<?> query) {
|
||||
String label = parent.planLabel();
|
||||
if (label != null) {
|
||||
query.setProfilePath(label, fullPath + "(" + query.loadMode() + ")", parent.profileLocation());
|
||||
query.setProfilePath(label, pathMode(query), parent.profileLocation());
|
||||
}
|
||||
}
|
||||
|
||||
private String pathMode(SpiQuery<?> query) {
|
||||
final var loadMode = query.loadMode();
|
||||
return fullPath == null ? '_' + loadMode : fullPath + "__" + loadMode;
|
||||
}
|
||||
|
||||
PersistenceContext persistenceContext() {
|
||||
return parent.persistenceContext();
|
||||
}
|
||||
|
||||
@@ -84,6 +84,9 @@ public final class BatchedPstmt implements SpiProfileTransactionEvent {
|
||||
*/
|
||||
private void flushStatementBatch() throws SQLException {
|
||||
final int[] rows = pstmt.executeBatch();
|
||||
if (transaction.isLogSql()) {
|
||||
transaction.logSql(" -- executeBatch() size:{0} sql:{1}", rows.length, sql);
|
||||
}
|
||||
if (rows.length != list.size()) {
|
||||
throw new IllegalStateException("Invalid state on executeBatch, rows:" + rows.length + " != " + list.size());
|
||||
}
|
||||
@@ -153,6 +156,9 @@ public final class BatchedPstmt implements SpiProfileTransactionEvent {
|
||||
private void executeAndCheckRowCounts() throws SQLException {
|
||||
try {
|
||||
results = pstmt.executeBatch();
|
||||
if (transaction.isLogSql()) {
|
||||
transaction.logSql(" -- executeBatch() size:{0} sql:{1}", results.length, sql);
|
||||
}
|
||||
if (results.length != list.size()) {
|
||||
throw new SQLException("Invalid state on executeBatch, rows:" + results.length + " != " + list.size());
|
||||
}
|
||||
|
||||
@@ -119,7 +119,11 @@ public final class Binder {
|
||||
if (param.isEncryptionKey()) {
|
||||
bindLog.append("****");
|
||||
} else {
|
||||
bindLog.append(value);
|
||||
String sv = String.valueOf(value);
|
||||
if (sv.length() > 50) {
|
||||
sv = sv.substring(0, 47) + "...";
|
||||
}
|
||||
bindLog.append(sv);
|
||||
}
|
||||
}
|
||||
if (value instanceof Collection) {
|
||||
|
||||
@@ -411,7 +411,7 @@ public final class DefaultPersister implements Persister {
|
||||
if (bean._ebean_getIntercept().isUpdate()) {
|
||||
update(bean, t);
|
||||
} else {
|
||||
insert(bean, t);
|
||||
insert(bean, null, t);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -419,12 +419,15 @@ public final class DefaultPersister implements Persister {
|
||||
* Insert this bean.
|
||||
*/
|
||||
@Override
|
||||
public void insert(EntityBean bean, Transaction t) {
|
||||
public void insert(EntityBean bean, InsertOptions insertOptions, Transaction t) {
|
||||
PersistRequestBean<?> req = createRequest(bean, t, PersistRequest.Type.INSERT);
|
||||
if (req.isSkipReference()) {
|
||||
// skip insert on reference bean
|
||||
return;
|
||||
}
|
||||
if (insertOptions != null) {
|
||||
req.setInsertOptions(insertOptions);
|
||||
}
|
||||
try {
|
||||
req.initTransIfRequiredWithBatchCascade();
|
||||
insert(req);
|
||||
|
||||
@@ -328,7 +328,7 @@ final class SaveManyBeans extends SaveManyBase {
|
||||
}
|
||||
|
||||
private boolean isChangedProperty() {
|
||||
return parentBean._ebean_getIntercept().isChangedProperty(many.propertyIndex());
|
||||
return request.isChangedProperty(many.propertyIndex());
|
||||
}
|
||||
|
||||
private void removeAssocManyOrphans() {
|
||||
|
||||
+9
-1
@@ -1,11 +1,15 @@
|
||||
package io.ebeaninternal.server.persist.dml;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Helper to support the generation of DML statements.
|
||||
*/
|
||||
public final class GenerateDmlRequest {
|
||||
|
||||
private final StringBuilder sb = new StringBuilder(100);
|
||||
private final List<String> columns = new ArrayList<>();
|
||||
private StringBuilder insertBindBuffer;
|
||||
private String prefix;
|
||||
private String prefix2;
|
||||
@@ -26,7 +30,7 @@ public final class GenerateDmlRequest {
|
||||
++bindColumnCount;
|
||||
sb.append(prefix);
|
||||
sb.append(column);
|
||||
//sb.append(expr);
|
||||
columns.add(column);
|
||||
if (insertMode > 0) {
|
||||
if (insertMode++ > 1) {
|
||||
insertBindBuffer.append(',');
|
||||
@@ -75,4 +79,8 @@ public final class GenerateDmlRequest {
|
||||
public boolean isUpdate() {
|
||||
return insertMode == 0;
|
||||
}
|
||||
|
||||
public List<String> columns() {
|
||||
return columns;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ public final class InsertHandler extends DmlHandler {
|
||||
|
||||
SpiTransaction t = persistRequest.transaction();
|
||||
// get the appropriate sql
|
||||
sql = meta.getSql(withId, persistRequest.isPublish());
|
||||
sql = meta.sql(withId, persistRequest.isPublish(), persistRequest.insertOptions());
|
||||
PreparedStatement pstmt;
|
||||
if (persistRequest.isBatched()) {
|
||||
pstmt = pstmtBatch(t, sql, persistRequest, useGeneratedKeys);
|
||||
@@ -134,7 +134,8 @@ public final class InsertHandler extends DmlHandler {
|
||||
if (idValue != null) {
|
||||
persistRequest.setGeneratedKey(idValue);
|
||||
}
|
||||
} else {
|
||||
} else if (persistRequest.insertOptions() == null) {
|
||||
// insert on conflict do nothing can not return generated key
|
||||
throw new PersistenceException("Autoincrement getGeneratedKeys() returned no rows?");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package io.ebeaninternal.server.persist.dml;
|
||||
|
||||
import io.ebean.InsertOptions;
|
||||
import io.ebean.annotation.Platform;
|
||||
import io.ebean.bean.EntityBean;
|
||||
import io.ebean.config.dbplatform.DatabasePlatform;
|
||||
@@ -36,9 +37,11 @@ final class InsertMeta {
|
||||
private final Bindable shadowFKey;
|
||||
private final String[] identityDbColumns;
|
||||
private final Platform platform;
|
||||
private final InsertMetaOptions options;
|
||||
|
||||
InsertMeta(DatabasePlatform dbPlatform, BeanDescriptor<?> desc, Bindable shadowFKey, BindableId id, BindableList all) {
|
||||
this.platform = dbPlatform.platform();
|
||||
this.options = InsertMetaPlatform.create(platform, desc, this);
|
||||
this.discriminator = discriminator(desc);
|
||||
this.id = id;
|
||||
this.all = all;
|
||||
@@ -47,8 +50,8 @@ final class InsertMeta {
|
||||
|
||||
String tableName = desc.baseTable();
|
||||
String draftTableName = desc.draftTable();
|
||||
this.sqlWithId = genSql(false, tableName, false);
|
||||
this.sqlDraftWithId = desc.isDraftable() ? genSql(false, draftTableName, true) : sqlWithId;
|
||||
this.sqlWithId = sql(false, tableName, false);
|
||||
this.sqlDraftWithId = desc.isDraftable() ? sql(false, draftTableName, true) : sqlWithId;
|
||||
|
||||
// only available for single Id property
|
||||
if (id.isConcatenated()) {
|
||||
@@ -72,8 +75,8 @@ final class InsertMeta {
|
||||
this.supportsGetGeneratedKeys = dbPlatform.dbIdentity().isSupportsGetGeneratedKeys();
|
||||
this.supportsSelectLastInsertedId = desc.supportsSelectLastInsertedId();
|
||||
}
|
||||
this.sqlNullId = genSql(true, tableName, false);
|
||||
this.sqlDraftNullId = desc.isDraftable() ? genSql(true, draftTableName, true) : sqlNullId;
|
||||
this.sqlNullId = sql(true, tableName, false);
|
||||
this.sqlDraftNullId = desc.isDraftable() ? sql(true, draftTableName, true) : sqlNullId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,9 +140,20 @@ final class InsertMeta {
|
||||
}
|
||||
|
||||
/**
|
||||
* get the sql based whether the id value(s) are null.
|
||||
* Return the sql for the given options.
|
||||
*/
|
||||
public String getSql(boolean withId, boolean publish) {
|
||||
public String sql(boolean withId, boolean publish, InsertOptions insertOptions) {
|
||||
if (insertOptions == null) {
|
||||
return sql(withId, publish);
|
||||
}
|
||||
return options.sql(withId, insertOptions);
|
||||
}
|
||||
|
||||
String sqlFor(boolean withId) {
|
||||
return withId ? sqlWithId : sqlNullId;
|
||||
}
|
||||
|
||||
private String sql(boolean withId, boolean publish) {
|
||||
if (withId) {
|
||||
return publish ? sqlWithId : sqlDraftWithId;
|
||||
} else {
|
||||
@@ -147,12 +161,18 @@ final class InsertMeta {
|
||||
}
|
||||
}
|
||||
|
||||
private String genSql(boolean nullId, String table, boolean draftTable) {
|
||||
private String sql(boolean nullId, String table, boolean draftTable) {
|
||||
GenerateDmlRequest request = new GenerateDmlRequest();
|
||||
sql(request, nullId, table, draftTable);
|
||||
return request.toString();
|
||||
}
|
||||
|
||||
void sql(GenerateDmlRequest request, boolean nullId, String table, boolean draftTable) {
|
||||
request.setInsertSetMode();
|
||||
request.append("insert into ").append(table);
|
||||
if (nullId && noColumnsForInsert(draftTable)) {
|
||||
return request.append(defaultValues()).toString();
|
||||
request.append(defaultValues());
|
||||
return;
|
||||
}
|
||||
request.append(" (");
|
||||
if (!nullId) {
|
||||
@@ -172,7 +192,6 @@ final class InsertMeta {
|
||||
request.append(") values (");
|
||||
request.append(request.insertBindBuffer());
|
||||
request.append(")");
|
||||
return request.toString();
|
||||
}
|
||||
|
||||
private String defaultValues() {
|
||||
@@ -196,5 +215,4 @@ final class InsertMeta {
|
||||
&& discriminator == null
|
||||
&& (draftTable ? all.isEmpty() : allExcludeDraftOnly.isEmpty());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package io.ebeaninternal.server.persist.dml;
|
||||
|
||||
import io.ebean.InsertOptions;
|
||||
|
||||
/**
|
||||
* Generator for insert SQL with options.
|
||||
*/
|
||||
interface InsertMetaOptions {
|
||||
|
||||
/**
|
||||
* Generate the SQL for the given insert options.
|
||||
*/
|
||||
String sql(boolean withId, InsertOptions insertOptions);
|
||||
}
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
package io.ebeaninternal.server.persist.dml;
|
||||
|
||||
import io.ebean.InsertOptions;
|
||||
import io.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import io.ebeaninternal.server.deploy.BeanProperty;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Postgres specific generation of insert on conflict.
|
||||
*/
|
||||
final class InsertMetaOptionsPostgres implements InsertMetaOptions {
|
||||
|
||||
private final InsertMeta meta;
|
||||
private final BeanDescriptor<?> desc;
|
||||
private final String baseTable;
|
||||
private final Map<String, String> sqlCache = new ConcurrentHashMap<>();
|
||||
|
||||
InsertMetaOptionsPostgres(InsertMeta meta, BeanDescriptor<?> desc) {
|
||||
this.meta = meta;
|
||||
this.desc = desc;
|
||||
this.baseTable = desc.baseTable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String sql(boolean withId, InsertOptions options) {
|
||||
String key = withId + options.key();
|
||||
return sqlCache.computeIfAbsent(key, k -> generate(withId, options));
|
||||
}
|
||||
|
||||
private String generate(boolean withId, InsertOptions options) {
|
||||
char type = options.key().charAt(0);
|
||||
switch (type) {
|
||||
case 'U':
|
||||
return generate(withId, false, options);
|
||||
case 'N':
|
||||
return generate(withId, true, options);
|
||||
default:
|
||||
return meta.sqlFor(withId);
|
||||
}
|
||||
}
|
||||
|
||||
private String generate(boolean withId, boolean doNothing, InsertOptions options) {
|
||||
GenerateDmlRequest request = new GenerateDmlRequest();
|
||||
meta.sql(request, !withId, baseTable, false);
|
||||
request.append(" on conflict ");
|
||||
|
||||
List<String> uniqueColumns = desc.uniqueProps().stream()
|
||||
.flatMap(Arrays::stream)
|
||||
.map(BeanProperty::dbColumn)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
String constraintName = options.constraint();
|
||||
if (constraintName != null) {
|
||||
request.append("on constraint ").append(constraintName);
|
||||
} else {
|
||||
request.append("(");
|
||||
String cols = options.uniqueColumns();
|
||||
if (cols != null) {
|
||||
request.append(cols);
|
||||
} else {
|
||||
appendUniqueColumns(uniqueColumns, request);
|
||||
}
|
||||
request.append(")");
|
||||
}
|
||||
if (doNothing) {
|
||||
request.append(" do nothing");
|
||||
return request.toString();
|
||||
}
|
||||
request.append(" do update set ");
|
||||
String updateSet = options.updateSet();
|
||||
if (updateSet != null) {
|
||||
request.append(updateSet);
|
||||
} else {
|
||||
setColumns(withId, request, uniqueColumns);
|
||||
}
|
||||
return request.toString();
|
||||
}
|
||||
|
||||
private void setColumns(boolean withId, GenerateDmlRequest request, List<String> uniqueColumns) {
|
||||
List<String> columns = request.columns();
|
||||
columns.removeAll(uniqueColumns);
|
||||
if (withId) {
|
||||
BeanProperty idProperty = desc.idProperty();
|
||||
if (idProperty != null && !idProperty.isEmbedded()) {
|
||||
columns.remove(idProperty.dbColumn());
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < columns.size(); i++) {
|
||||
if (i > 0) {
|
||||
request.append(", ");
|
||||
}
|
||||
String col = columns.get(i);
|
||||
request.append(col).append("=excluded.").append(col);
|
||||
}
|
||||
}
|
||||
|
||||
private static void appendUniqueColumns(List<String> uniqueColumns, GenerateDmlRequest request) {
|
||||
if (uniqueColumns.isEmpty()) {
|
||||
throw new IllegalStateException("Unable to identify unique columns for INSERT ON CONFLICT - Add mapping like @Column(unique=true) or @Index(unique=true)");
|
||||
}
|
||||
for (int i = 0; i < uniqueColumns.size(); i++) {
|
||||
if (i > 0) {
|
||||
request.append(", ");
|
||||
}
|
||||
request.append(uniqueColumns.get(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user